From 2abc3ef28a97e20f046d0b854fb583d0b9be081b Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 3 Oct 2024 15:07:30 +0200 Subject: [PATCH 01/77] Content updates, capitalization fixes --- .../administration/admin_panel/admin_panel.md | 2 +- .../admin_panel/roles_admin_panel.md | 30 ++-- .../admin_panel/segments_admin_panel.md | 6 +- .../system_information_admin_panel.md | 2 +- .../admin_panel/users_admin_panel.md | 12 +- .../back_office/add_user_setting.md | 6 +- .../administration/back_office/back_office.md | 10 +- .../back_office/back_office_configuration.md | 8 +- .../back_office_elements/add_drag_and_drop.md | 4 +- .../back_office_elements/add_dropdowns.md | 4 +- .../back_office_elements/custom_components.md | 4 +- .../back_office_elements/custom_icons.md | 4 +- .../extending_thumbnails.md | 6 +- .../formatting_date_and_time.md | 4 +- .../reusable_components.md | 4 +- .../back_office_menus/add_menu_item.md | 6 +- .../back_office_menus/back_office_menus.md | 6 +- .../back_office_tabs/back_office_tabs.md | 6 +- .../back_office_tabs/create_dashboard_tab.md | 2 +- .../back_office/browser/add_browser_tab.md | 2 +- .../back_office/browser/browser.md | 8 +- .../back_office/content_tab_switcher.md | 12 +- .../back_office/content_tree.md | 12 +- .../back_office/customize_search_sorting.md | 4 +- .../customize_search_suggestion.md | 10 +- .../back_office/multifile_upload.md | 2 +- .../back_office/notifications.md | 8 +- .../back_office/subitems_list.md | 2 +- .../configuration/configuration.md | 2 +- .../configuration/repository_configuration.md | 8 +- .../content_organization/content_types.md | 6 +- .../content_organization/object_states.md | 4 +- .../content_organization/sections.md | 2 +- .../dashboard/configure_default_dashboard.md | 12 +- .../dashboard/customize_dashboard.md | 2 +- .../project_organization/architecture.md | 4 +- .../project_organization/bundles.md | 12 +- .../recent_activity/recent_activity.md | 14 +- docs/api/event_reference/event_reference.md | 2 +- docs/api/event_reference/role_events.md | 6 +- docs/api/event_reference/user_events.md | 6 +- docs/api/php_api/php_api.md | 6 +- docs/api/rest_api/rest_api_authentication.md | 12 +- .../rest_api/rest_api_usage/rest_api_usage.md | 2 +- docs/cdp/cdp_activation/cdp_configuration.md | 4 +- docs/cdp/cdp_guide.md | 4 +- .../storefront/configure_storefront.md | 2 +- docs/commerce/storefront/extend_storefront.md | 2 +- .../content_api/managing_content.md | 2 +- .../content_availability.md | 2 +- .../content_management_guide.md | 24 +-- .../data_migration/data_migration_actions.md | 8 +- .../data_migration/exporting_data.md | 4 +- .../data_migration/importing_data.md | 18 +- .../create_custom_field_type_comparison.md | 2 +- .../create_custom_generic_field_type.md | 2 +- .../customize_field_type_metadata.md | 4 +- .../field_type_reference/maplocationfield.md | 2 +- .../field_type_reference/measurementfield.md | 2 +- .../field_type_reference/pagefield.md | 2 +- .../field_types/form_and_template.md | 10 +- .../binary_and_media_download.md | 2 +- .../forms/create_custom_form_field.md | 2 +- .../forms/create_form_attribute.md | 2 +- .../images/add_image_asset_from_dam.md | 2 +- docs/content_management/locations.md | 10 +- .../pages/create_custom_page_block.md | 2 +- .../pages/page_builder_guide.md | 6 +- .../rich_text/extend_online_editor.md | 8 +- .../url_management/url_management.md | 6 +- .../user_generated_content.md | 2 +- docs/customer_management/cp_applications.md | 6 +- docs/customer_management/cp_configuration.md | 4 +- .../customer_portal_guide.md | 14 +- docs/getting_started/first_steps.md | 24 +-- docs/getting_started/troubleshooting.md | 2 +- docs/ibexa_products/ibexa_experience.md | 2 +- docs/ibexa_products/ibexa_headless.md | 18 +- .../cache/http_cache/context_aware_cache.md | 4 +- .../cache/http_cache/reverse_proxy.md | 6 +- .../clustering/clustering_with_ddev.md | 2 +- .../request_lifecycle.md | 2 +- .../security/security_checklist.md | 22 +-- .../support_and_maintenance_faq.md | 8 +- .../languages/back_office_translations.md | 22 +-- docs/multisite/languages/languages.md | 6 +- docs/multisite/multisite_configuration.md | 14 +- .../set_up_translation_siteaccess.md | 6 +- docs/multisite/site_factory/site_factory.md | 8 +- .../site_factory_configuration.md | 32 ++-- docs/permissions/custom_policies.md | 16 +- docs/permissions/limitation_reference.md | 160 +++++++++--------- docs/permissions/permission_overview.md | 32 ++-- docs/permissions/permission_use_cases.md | 118 ++++++------- docs/permissions/permissions.md | 4 +- docs/permissions/policies.md | 72 ++++---- .../api_reference/recommendation_api.md | 2 +- .../personalization/enable_personalization.md | 8 +- docs/pim/create_custom_attribute_type.md | 2 +- docs/pim/create_custom_catalog_filter.md | 4 +- docs/pim/enable_purchasing_products.md | 4 +- docs/pim/pim_configuration.md | 2 +- docs/pim/pim_guide.md | 2 +- docs/pim/prices.md | 2 +- docs/pim/products.md | 2 +- docs/release_notes/ez_platform_v1.9.0.md | 2 +- docs/release_notes/ez_platform_v2.1.0.md | 2 +- docs/release_notes/ez_platform_v2.2.0.md | 8 +- docs/release_notes/ez_platform_v2.3.md | 8 +- docs/release_notes/ez_platform_v2.4.md | 2 +- docs/release_notes/ez_platform_v2.5.md | 28 +-- docs/release_notes/ez_platform_v3.0.md | 12 +- .../ez_platform_v3.0_deprecations.md | 8 +- docs/release_notes/ez_platform_v3.1.md | 6 +- docs/release_notes/ibexa_dxp_v3.2.md | 14 +- docs/release_notes/ibexa_dxp_v4.0.md | 2 +- .../ibexa_dxp_v4.0_deprecations.md | 2 +- docs/release_notes/ibexa_dxp_v4.1.md | 6 +- docs/release_notes/ibexa_dxp_v4.2.md | 8 +- docs/release_notes/ibexa_dxp_v4.3.md | 2 +- docs/release_notes/ibexa_dxp_v4.5.md | 6 +- docs/release_notes/ibexa_dxp_v4.6.md | 14 +- .../contributing/contribute_translations.md | 4 +- docs/resources/new_in_doc.md | 8 +- docs/resources/phpstorm_plugin.md | 2 +- .../criteria_reference/depth_criterion.md | 2 +- .../search_criteria_reference.md | 2 +- .../usermetadata_criterion.md | 4 +- .../manipulate_elasticsearch_query.md | 2 +- docs/search/search_api.md | 4 +- .../depth_sort_clause.md | 2 +- .../sort_clause_reference.md | 2 +- .../layout/add_forgot_password_option.md | 2 +- .../other_twig_filters.md | 2 +- .../2_create_the_content_model.md | 2 +- .../4_display_single_content_item.md | 4 +- .../5_display_a_list_of_content_items.md | 4 +- .../8_enable_account_registration.md | 36 ++-- .../generic_field_type/5_add_a_field.md | 4 +- .../generic_field_type/6_settings.md | 2 +- .../1_get_a_starter_website.md | 4 +- .../2_prepare_the_landing_page.md | 2 +- .../5_create_newsletter_form.md | 4 +- .../update_code/1_update_templates.md | 2 +- .../update_code/7_update_extensions.md | 4 +- docs/update_and_migration/from_3.3/to_4.0.md | 4 +- .../from_4.2/update_from_4.2.md | 4 +- .../from_4.5/update_from_4.5.md | 8 +- .../migrating_from_ez_publish_platform.md | 2 +- docs/users/customer_groups.md | 4 +- docs/users/invitations.md | 12 +- docs/users/login_methods.md | 2 +- docs/users/oauth_client.md | 4 +- docs/users/passwords.md | 6 +- docs/users/user_management_guide.md | 22 +-- docs/users/user_registration.md | 8 +- docs/users/users.md | 2 +- mkdocs.yml | 20 +-- 158 files changed, 693 insertions(+), 693 deletions(-) diff --git a/docs/administration/admin_panel/admin_panel.md b/docs/administration/admin_panel/admin_panel.md index 5d12352a0c..654b63b5a7 100644 --- a/docs/administration/admin_panel/admin_panel.md +++ b/docs/administration/admin_panel/admin_panel.md @@ -1,5 +1,5 @@ --- -description: Ibexa DXP Back Office contains managements options for permissions, users, languages, content types, as well as system information. +description: Ibexa DXP back office contains managements options for permissions, users, languages, content types, as well as system information. page_type: landing_page --- diff --git a/docs/administration/admin_panel/roles_admin_panel.md b/docs/administration/admin_panel/roles_admin_panel.md index 84696d375d..558ef0741a 100644 --- a/docs/administration/admin_panel/roles_admin_panel.md +++ b/docs/administration/admin_panel/roles_admin_panel.md @@ -1,43 +1,43 @@ --- -description: To give users an access to your website you need to assign them Roles in the Admin Panel. +description: To give users an access to your website you need to assign them roles in the Admin Panel. --- # Roles -To give users an access to your website you need to assign them Roles in the Admin Panel. +To give users an access to your website you need to assign them roles in the Admin Panel. ![Roles](admin_panel_roles.png "Roles") -Each Role consists of: +Each role consists of: **Policies** ![Policies](admin_panel_policies.png "Policies") Rules that give users access to different function in a module. -You can restrict what user can do with Limitations. -The available Limitations depend on the chosen Policy. -When Policy has more than one Limitation, all of them have to apply. +You can restrict what user can do with limitations. +The available limitations depend on the chosen policy. +When policy has more than one limitation, all of them have to apply. See [example use case](permission_use_cases.md#restrict-editing-to-part-of-the-tree). !!! note - Limitation specifies what a User can do, not what they can't do. - A `Location` Limitation, for example, gives the User access to content with a specific Location, + Limitation specifies what a user can do, not what they can't do. + A `Location` limitation, for example, gives the user access to content with a specific Location, not prohibits it. See [Limitation reference](limitation_reference.md) for further information. **Assignments** ![Assignments](admin_panel_assignments.png "Assignments") -After you created all Policies, you can assign the Role to Users and/or User Groups with possible additional Limitations. -Every User or User Group can have multiple Roles. -A User can also belong to many groups, for example, Administrators, Editors, Subscribers. +After you created all policies, you can assign the role to users and/or user groups with possible additional limitations. +Every user or user group can have multiple roles. +A user can also belong to many groups, for example, Administrators, Editors, Subscribers. -Best practice is to avoid assigning Roles to Users directly. -Model your content (content types, Sections, Locations etc.) in a way that can be accessed by generic Roles. +Best practice is to avoid assigning roles to users directly. +Model your content (content types, Sections, Locations etc.) in a way that can be accessed by generic roles. That way system will be more secure and easier to manage. -This approach also improves performance. Role assignments and Policies are taken into account during search/load queries. +This approach also improves performance. Role assignments and policies are taken into account during search/load queries. See [Permissions overview](permissions.md) for further information -and [Permission use cases](permission_use_cases.md) for details on how to customize access to different parts of the Back Office. \ No newline at end of file +and [Permission use cases](permission_use_cases.md) for details on how to customize access to different parts of the back office. \ No newline at end of file diff --git a/docs/administration/admin_panel/segments_admin_panel.md b/docs/administration/admin_panel/segments_admin_panel.md index ebb7da216c..80a57a83f3 100644 --- a/docs/administration/admin_panel/segments_admin_panel.md +++ b/docs/administration/admin_panel/segments_admin_panel.md @@ -1,11 +1,11 @@ --- -description: You can use Segments to display specific content to specific Users. +description: You can use Segments to display specific content to specific users. edition: experience --- # Segments -You can use Segments to display specific content to specific [Users](users.md). +You can use Segments to display specific content to specific [ussers](users.md). They are used out of the box in the Targeting and Dynamic targeting blocks in the Page. Segments are collected in Segment Groups: @@ -16,4 +16,4 @@ Each Segment Group can contain Segments that you can target content for. ![Segment](admin_panel_segment.png) -You can assign Users to Segments [through the API](segment_api.md#assigning-users). \ No newline at end of file +You can assign users to Segments [through the API](segment_api.md#assigning-users). \ No newline at end of file diff --git a/docs/administration/admin_panel/system_information_admin_panel.md b/docs/administration/admin_panel/system_information_admin_panel.md index 33a88016d9..f94d09223c 100644 --- a/docs/administration/admin_panel/system_information_admin_panel.md +++ b/docs/administration/admin_panel/system_information_admin_panel.md @@ -4,7 +4,7 @@ description: System information provides basic system information such as versio # System Information -The System Information panel in the Back Office is sourced in the [`ibexa/system-info` repository](https://github.com/ibexa/system-info). +The System Information panel in the back office is sourced in the [`ibexa/system-info` repository](https://github.com/ibexa/system-info). There you will also find basic system information such as versions of all installed packages. ![System Information](admin_panel_system_info.png "System Information") diff --git a/docs/administration/admin_panel/users_admin_panel.md b/docs/administration/admin_panel/users_admin_panel.md index fb8f25dd0b..2b77d93f29 100644 --- a/docs/administration/admin_panel/users_admin_panel.md +++ b/docs/administration/admin_panel/users_admin_panel.md @@ -1,17 +1,17 @@ --- -description: All User Groups and Users can be accessed in the Users tab. +description: All user groups and users can be accessed in the users tab. --- # Users [Users](users.md) in [[= product_name =]] are treated the same way as content items. -They are organized in groups such as *Guests*, *Editors*, *Anonymous*, +They are organized in groups such as *Guests*, *Editors*, *Anonymous*, which makes it easier to manage them and their permissions. -All User Groups and Users can be accessed in the Admin panel by selecting Users. +All user groups and users can be accessed in the Admin panel by selecting **Users**. -![Users and User Groups](admin_panel_users.png "Users and User Groups") +![Users and user groups](admin_panel_users.png "Users and user groups") !!! caution - Be careful not to delete an existing User account. - If you do this, content created by this User will be broken and the application can face malfunction. + Be careful not to delete an existing user account. + If you do this, content created by this user will be broken and the application can face malfunction. diff --git a/docs/administration/back_office/add_user_setting.md b/docs/administration/back_office/add_user_setting.md index 0d248809c9..6f72b0040f 100644 --- a/docs/administration/back_office/add_user_setting.md +++ b/docs/administration/back_office/add_user_setting.md @@ -4,9 +4,9 @@ description: Add the option to select a custom preference in user menu. # Add user setting -## Create new User setting +## Create new user setting -You can add new preferences to the **User Settings** menu in the Back Office. +You can add new preferences to the **User Settings** menu in the back office. To do so, create a setting class implementing two interfaces: `ValueDefinitionInterface` and `FormMapperInterface`. @@ -24,7 +24,7 @@ Register the setting as a service: [[= include_file('code_samples/back_office/settings/config/custom_services.yaml', 0, 5) =]] ``` -You can order the settings in the User menu by setting their `priority`. +You can order the settings in the **User** menu by setting their `priority`. `group` indicates the group that the setting is placed in. It can be one of the built-in groups, or a custom one. diff --git a/docs/administration/back_office/back_office.md b/docs/administration/back_office/back_office.md index e7c92f0266..c7174cc8bc 100644 --- a/docs/administration/back_office/back_office.md +++ b/docs/administration/back_office/back_office.md @@ -1,15 +1,15 @@ --- -description: Back Office holds the administrator and editor interface and allows creating, publishing and managing content, users, settings and so on. +description: Back office holds the administrator and editor interface and allows creating, publishing and managing content, users, settings and so on. page_type: landing_page --- -# Back Office +# Back office -The Back Office interface is produced by the [`ibexa/admin-ui` bundle](https://github.com/ibexa/admin-ui). +The back office interface is produced by the [`ibexa/admin-ui` bundle](https://github.com/ibexa/admin-ui). Additionally, it uses React-based modules that make each part of the UI extensible, and Bootstrap for styling. The interface is accessible in your browser at `http:///admin`. -To extend the Back Office with PHP code, you can use [events]([[= symfony_doc =]]/event_dispatcher.html), +To extend the back office with PHP code, you can use [events]([[= symfony_doc =]]/event_dispatcher.html), either built-in Symfony events or events dispatched by the application. Some extensibility, such as [adding custom tags](extend_online_editor.md#configure-custom-tags), @@ -18,7 +18,7 @@ is possible without writing your own code, with configuration and templating onl !!! note "String translations" Refer to [Custom string translations](back_office_translations.md#custom-string-translations) - to learn how to provide string translations when extending the Back Office. + to learn how to provide string translations when extending the back office. [[= cards([ "administration/back_office/back_office_configuration", diff --git a/docs/administration/back_office/back_office_configuration.md b/docs/administration/back_office/back_office_configuration.md index 80ae2cfccf..3bb5a9f3d7 100644 --- a/docs/administration/back_office/back_office_configuration.md +++ b/docs/administration/back_office/back_office_configuration.md @@ -1,13 +1,13 @@ --- -title: Back Office configuration -description: Configure default upload locations, pagination limits, and more settings for the Back Office. +title: Back office configuration +description: Configure default upload locations, pagination limits, and more settings for the back office. --- -# Back Office configuration +# Back office configuration ## Pagination limits -Default pagination limits for different sections of the Back Office can be defined through respective settings in +Default pagination limits for different sections of the back office can be defined through respective settings in [`ezplatform_default_settings.yaml`](https://github.com/ibexa/admin-ui/blob/main/src/bundle/Resources/config/ezplatform_default_settings.yaml#L7) You can set the pagination limit for user settings under the `ibexa.system..pagination_user` [configuration key](configuration.md#configuration-files): diff --git a/docs/administration/back_office/back_office_elements/add_drag_and_drop.md b/docs/administration/back_office/back_office_elements/add_drag_and_drop.md index 1ff686327a..3a68aa93b5 100644 --- a/docs/administration/back_office/back_office_elements/add_drag_and_drop.md +++ b/docs/administration/back_office/back_office_elements/add_drag_and_drop.md @@ -1,10 +1,10 @@ --- -description: Add custom drag-and-drop interactions to Back Office interface. +description: Add custom drag-and-drop interactions to back office interface. --- # Add drag and drop -You can create a generic interface for drag and drop interactions that you can reuse in many places across the Back Office. +You can create a generic interface for drag and drop interactions that you can reuse in many places across the back office. First, prepare the HTML code structure and place it in a Twig template. See the example: diff --git a/docs/administration/back_office/back_office_elements/add_dropdowns.md b/docs/administration/back_office/back_office_elements/add_dropdowns.md index f3a41fb513..655e0c935c 100644 --- a/docs/administration/back_office/back_office_elements/add_dropdowns.md +++ b/docs/administration/back_office/back_office_elements/add_dropdowns.md @@ -1,10 +1,10 @@ --- -description: Add custom drop down menus to Back Office interface. +description: Add custom drop down menus to back office interface. --- # Add drop-downs -In [[= product_name =]], you can create a reusable custom drop-down and implement it anywhere in the Back Office. +In [[= product_name =]], you can create a reusable custom drop-down and implement it anywhere in the back office. Follow the steps below to learn how to integrate this component to fit it to your project needs. ## Create `` input, for example: - + {% endset %} ``` @@ -88,7 +88,8 @@ For `value`, see the example: ## Prepare custom drop-down structure -Next, prepare the component structure and place it in the template after setting the needed attributes. See the example: +Next, prepare the component structure and place it in the template after setting the needed attributes. +See the example: ```twig {% include '@ibexadesign/ui/component/dropdown/dropdown.html.twig' with { diff --git a/docs/administration/back_office/back_office_elements/custom_components.md b/docs/administration/back_office/back_office_elements/custom_components.md index 4677cafa74..5f490bc4fc 100644 --- a/docs/administration/back_office/back_office_elements/custom_components.md +++ b/docs/administration/back_office/back_office_elements/custom_components.md @@ -37,8 +37,7 @@ App\Component\MyNewComponent: ## Base component classes -If you only need to inject a short element (for example, a Twig template or a CSS link) without writing a class, -you can make use of the following base classes: +If you only need to inject a short element (for example, a Twig template or a CSS link) without writing a class, you can make use of the following base classes: - `TwigComponent` renders a Twig template. - `LinkComponent` renders the HTML `` tag. diff --git a/docs/administration/back_office/back_office_elements/custom_icons.md b/docs/administration/back_office/back_office_elements/custom_icons.md index 8d3276b3ed..574bb31b97 100644 --- a/docs/administration/back_office/back_office_elements/custom_icons.md +++ b/docs/administration/back_office/back_office_elements/custom_icons.md @@ -6,8 +6,7 @@ description: Configure custom icons to use for content types. ## Customize content type icons -To add custom icons for existing content types or custom content types in [[= product_name =]], -use the following configuration under the `ibexa.system..content_type` [configuration key](configuration.md#configuration-files): +To add custom icons for existing content types or custom content types in [[= product_name =]], use the following configuration under the `ibexa.system..content_type` [configuration key](configuration.md#configuration-files): ```yaml ibexa: diff --git a/docs/administration/back_office/back_office_elements/extending_thumbnails.md b/docs/administration/back_office/back_office_elements/extending_thumbnails.md index b7da91cd91..40ab2bd489 100644 --- a/docs/administration/back_office/back_office_elements/extending_thumbnails.md +++ b/docs/administration/back_office/back_office_elements/extending_thumbnails.md @@ -109,5 +109,5 @@ Next, add the strategy with the `ibexa.repository.thumbnail.strategy.field` tag tags: - { name: ibexa.repository.thumbnail.strategy.field, priority: 100 } ``` - + At this point you can go to the back office and check the results. diff --git a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md index ce61d60d8c..4fcca0c224 100644 --- a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md +++ b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md @@ -35,9 +35,7 @@ To import CSS files only, use: For a full example of importing asset configuration, see [`ibexa.config.js`](https://github.com/ibexa/admin-ui/blob/main/src/bundle/Resources/encore/ibexa.config.js) -To edit existing configuration entries, either in the bundle's `Resources/encore/` folder, -or in the `encore` folder in the root folder of your project, -create an `ibexa.config.manager.js` file: +To edit existing configuration entries, either in the bundle's `Resources/encore/` folder, or in the `encore` folder in the root folder of your project, create an `ibexa.config.manager.js` file: ``` js const path = require('path'); @@ -80,9 +78,7 @@ module.exports = (ibexaConfig, ibexaConfigManager) => { For a full example of overriding configuration, see [`ibexa.config.manager.js`](https://github.com/ibexa/fieldtype-matrix/blob/main/src/bundle/Resources/encore/ibexa.config.manager.js). -To add a new configuration under your own namespace and with its own dependencies, -create an `ibexa.webpack.custom.config.js` file that you create either in the bundle's `Resources/encore/` folder, -or in the `encore` folder in the root directory of your project, for example: +To add a new configuration under your own namespace and with its own dependencies, create an `ibexa.webpack.custom.config.js` file that you create either in the bundle's `Resources/encore/` folder, or in the `encore` folder in the root directory of your project, for example: ``` js const Encore = require('@symfony/webpack-encore'); @@ -103,18 +99,15 @@ or in the `encore` folder in the root directory of your project, for example: !!! tip - If you don't plan to add multiple entry files on the same page in your custom configuration, - use the `disableSingleRuntimeChunk()` function to avoid adding a separate `runtime.js` file. + If you don't plan to add multiple entry files on the same page in your custom configuration, use the `disableSingleRuntimeChunk()` function to avoid adding a separate `runtime.js` file. Otherwise, your JS code may be run multiple times. By default, the `enableSingleRuntimeChunk()` function is used. ## Configuration from main project files -If you prefer to include the asset configuration in the main project files, -add it in [`webpack.config.js`](https://github.com/ibexa/recipes/blob/master/ibexa/oss/4.0/encore/webpack.config.js#L31). +If you prefer to include the asset configuration in the main project files, add it in [`webpack.config.js`](https://github.com/ibexa/recipes/blob/master/ibexa/oss/4.0/encore/webpack.config.js#L31). -To overwrite the built-in assets, use the following configuration to replace, remove or add asset files -in `webpack.config.js`: +To overwrite the built-in assets, use the following configuration to replace, remove or add asset files in `webpack.config.js`: ``` js ibexaConfigManager.replace({ diff --git a/docs/administration/back_office/back_office_elements/reusable_components.md b/docs/administration/back_office/back_office_elements/reusable_components.md index 0fd5eb9d8e..c4f28cc621 100644 --- a/docs/administration/back_office/back_office_elements/reusable_components.md +++ b/docs/administration/back_office/back_office_elements/reusable_components.md @@ -19,7 +19,7 @@ With `embed` you can override blocks that are defined inside the included templa The alert component has the following properties: -- `type` - available types of alert: error, info, success and warning +- `type` - available types of alert: error, info, success, and warning - `icon` - name of the icon, taken from the default icon set - `icon_path` - full icon path, in case you do not want to use an icon from the default icon set - `title` - alert title @@ -208,14 +208,14 @@ The following example shows how to render both text and hyperlink which redirect See the example below to learn how to create an action button which removes the article in the table. The table component has to be wrapped into the remove article form. -As in many cases you want a button to be disabled when no item in a table is selected and enabled otherwise, there is a built-in mechanism for this. +As in many cases you want a button to be disabled when no item in a table is selected and enabled otherwise, there is a built-in mechanism for this. To enable it you need to add the `ibexa-toggle-btn-state` CSS class to the form element alongside `data-toggle-button-id` data-attribute which holds the id of the button that should be enabled/disabled after a checkbox state change. Next, pass a button under the `action` parameter to the table headline. Action buttons are rendered on the right side of the table headline (do not confuse it with the table header). -You can also specify headline text, which is a table title displayed above, by passing it under `headline` parameter. +You can also specify headline text, which is a table title displayed above, by passing it under `headline` parameter. You can generate various headline texts using the `results_headline` macro with a few parameters: @@ -230,10 +230,10 @@ Column types available for the table header : - normal content column `{ content: col_name }` (content is the title of the column) - icon column `{ has_icon: true }` - checkbox column `{ has_checkbox: true }` -- action buttons column `{ }` +- action buttons column `{ }` Additional parameters available for all of the objects mentioned earlier: - + - class (CSS class) - attr (HTML attributes) @@ -297,10 +297,11 @@ To avoid wrapping headline inside the form, as it's done in the earlier example, {% endblock %} ``` -This method is useful in case of another form inside headline actions or to avoid interferences with the form like button triggering its submission. +This method is practical in case of another form inside headline actions or to avoid interferences with the form like button triggering its submission. By default, tables are wrapped in a scrollable wrapper which prevents them from being too long. To disable it, set the `is_scrollable` parameter to `false`. + !!! tip For an example of using the table component, see [Add menu item](add_menu_item.md). diff --git a/docs/administration/back_office/back_office_menus/add_menu_item.md b/docs/administration/back_office/back_office_menus/add_menu_item.md index 826ae078af..0c0ea85f62 100644 --- a/docs/administration/back_office/back_office_menus/add_menu_item.md +++ b/docs/administration/back_office/back_office_menus/add_menu_item.md @@ -4,11 +4,9 @@ description: Create a custom menu in the back office. # Add menu item -To add a new menu entry in the back office, you need to use an event subscriber -and subscribe to [one of the events](back_office_menus.md#menu-events) dispatched when building menus. +To add a new menu entry in the back office, you need to use an event subscriber and subscribe to [one of the events](back_office_menus.md#menu-events) dispatched when building menus. -The following example shows how to add a "Content list" item to the main top menu -and list all content items there, with a shortcut button to edit them. +The following example shows how to add a "Content list" item to the main top menu and list all content items there, with a shortcut button to edit them. ## Create event subscriber @@ -48,10 +46,7 @@ Finally, create the `templates/themes/admin/list/all_content_list.html.twig` fil [[= include_file('code_samples/back_office/menu/menu_item/templates/themes/admin/all_content_list.html.twig') =]] ``` -This template uses the [reusable table template](reusable_components.md#tables) -to render a table that fits the style of the back office. +This template uses the [reusable table template](reusable_components.md#tables) to render a table that fits the style of the back office. -You can configure the columns of the table in the `head_cols` variable -and the regular table rows in `body_rows`. -In this case, `body_rows` contains information about the content item provided by the controller, -and an edit button. +You can configure the columns of the table in the `head_cols` variable and the regular table rows in `body_rows`. +In this case, `body_rows` contains information about the content item provided by the controller, and an edit button. diff --git a/docs/administration/back_office/back_office_menus/back_office_menus.md b/docs/administration/back_office/back_office_menus/back_office_menus.md index 9a928728cc..717ec37114 100644 --- a/docs/administration/back_office/back_office_menus/back_office_menus.md +++ b/docs/administration/back_office/back_office_menus/back_office_menus.md @@ -4,7 +4,7 @@ description: All menus in the back office are based on KnpMenuBundle and you can # Back office menus -Back office menus are based on the [KnpMenuBundle](https://github.com/KnpLabs/KnpMenuBundle) and are easily extensible. +Back office menus are based on the [KnpMenuBundle](https://github.com/KnpLabs/KnpMenuBundle) and they're extensible. !!! tip @@ -15,8 +15,6 @@ Menus are extensible using event subscribers, for example: ``` php [[= include_file('code_samples/back_office/menu/menu_item/src/EventSubscriber/MyMenuSubscriber.php', 0, 29) =]] - } -} ``` !!! tip @@ -65,8 +63,7 @@ You can listen to the following events: ## Adding menu items -To add a menu item, use the `addChild()` method. Provide the method with the new menu item's identifier -and, optionally, with parameters. +To add a menu item, use the `addChild()` method. Provide the method with the new menu item's identifier and, optionally, with parameters. To add an inactive menu section, do not add a route to its parameters. @@ -133,8 +130,7 @@ For example, the following code changes the default icon for the **Create conten ## Removing menu items -To remove a menu item, for example, to remove the **Copy subtree** item from the right menu in content view, -use the following event listener: +To remove a menu item, for example, to remove the **Copy subtree** item from the right menu in content view, use the following event listener: ``` php [[= include_file('code_samples/back_office/menu/menu_item/src/EventSubscriber/MyMenuSubscriber.php', 44, 45) =]] diff --git a/docs/administration/back_office/back_office_tabs/back_office_tabs.md b/docs/administration/back_office/back_office_tabs/back_office_tabs.md index 820994df1b..ddd1857a67 100644 --- a/docs/administration/back_office/back_office_tabs/back_office_tabs.md +++ b/docs/administration/back_office/back_office_tabs/back_office_tabs.md @@ -4,7 +4,7 @@ description: Tabs are used for content view, in dashboard, system information an # Back office tabs -Many elements of the back office interface, such as content view, dashboard or system information, are built using tabs. +Many elements of the back office interface, such as content view, dashboard, or system information, are built using tabs. ![Tabs in System Information](tabs_system_info.png) @@ -56,7 +56,7 @@ Tabs are displayed according to this value in ascending order. It is good practice to reserve some distance between these values, for example to stagger them by step of 10. It may come useful if you later need to place something between the existing tabs. -You can also influence tab display (for example, order tabs, remove or modify them) by using the following event listeners: +You can also influence tab display (for example, order tabs, remove, or modify them) by using the following event listeners: - `TabEvents::TAB_GROUP_PRE_RENDER` - `TabEvents::TAB_PRE_RENDER` diff --git a/docs/administration/back_office/back_office_tabs/create_dashboard_tab.md b/docs/administration/back_office/back_office_tabs/create_dashboard_tab.md index d40d21b011..5ee6d5f32d 100644 --- a/docs/administration/back_office/back_office_tabs/create_dashboard_tab.md +++ b/docs/administration/back_office/back_office_tabs/create_dashboard_tab.md @@ -11,13 +11,10 @@ This adds a tab to the **Common content** dashboard block that displays all arti [[= include_file('code_samples/back_office/dashboard/article_tab/src/Tab/Dashboard/Everyone/EveryoneArticleTab.php') =]] ``` -This tab searches for content with content type "Article" (lines 57-60) -and renders the results using the built-in `all_content.html.twig` template, -which ensures the tab looks the same as the existing tabs (lines 71-73). +This tab searches for content with content type "Article" (lines 57-60) and renders the results using the built-in `all_content.html.twig` template, which ensures the tab looks the same as the existing tabs (lines 71-73). -The tab also implements OrderedTabInterface (line 17), -which enables you to define the order in which the tab is displayed on the dashboard page. -This is done using the `getOrder()` method (line 45). +The tab also implements OrderedTabInterface (line 17), which enables you to define the order in which the tab is displayed on the dashboard page. +It's done using the `getOrder()` method (line 45). Register this tab as a service: diff --git a/docs/administration/back_office/browser/add_browser_tab.md b/docs/administration/back_office/browser/add_browser_tab.md index f7a33a7b80..79585a81b5 100644 --- a/docs/administration/back_office/browser/add_browser_tab.md +++ b/docs/administration/back_office/browser/add_browser_tab.md @@ -119,7 +119,7 @@ ibexaConfigManager.add({ ``` ## Check results - + In the back office go to **Content** -> **Dashboard**. On the top right, click the **Create content** button. In the UDW a new **Images** tab appears, listing all images from the Repository. @@ -127,5 +127,5 @@ In the UDW a new **Images** tab appears, listing all images from the Repository. !!! tip - If you cannot see the results or encounter an error, clear the cache and reload the application. + If you cannot see the results or encounter an error, clear the cache and reload the application. Remember, after any change of css/js files you should always run `yarn encore dev` in the terminal. diff --git a/docs/administration/back_office/browser/browser.md b/docs/administration/back_office/browser/browser.md index 6ff384c574..318123c085 100644 --- a/docs/administration/back_office/browser/browser.md +++ b/docs/administration/back_office/browser/browser.md @@ -4,8 +4,8 @@ description: Customize the configuration of the content browser. # Browser -Browsing the content structure and selecting content from the Repository uses the module Universal Discovery Widget (UDW). UDW has an interactive interface -which allows you to create, move or copy content items. +Browsing the content structure and selecting content from the Repository uses the module Universal Discovery Widget (UDW). +UDW has an interactive interface which allows you to create, move or copy content items. ## Using UDW @@ -98,8 +98,7 @@ General configuration for tabs, for example, browse, search, bookmarks. |`title`|string|yes|The title of Universal Discovery Widget.| UDW configuration is SiteAccess-aware. For each defined SiteAccess, you need to be able to use the same configuration tree to define SiteAccess-specific config. -These settings need to be mapped to SiteAccess-aware internal parameters that -you can retrieve with the [ConfigResolver](dynamic_configuration.md#configresolver). +These settings need to be mapped to SiteAccess-aware internal parameters that you can retrieve with the [ConfigResolver](dynamic_configuration.md#configresolver). ## Add new configuration diff --git a/docs/administration/back_office/content_tab_switcher.md b/docs/administration/back_office/content_tab_switcher.md index 51038250cf..a7c9af48a0 100644 --- a/docs/administration/back_office/content_tab_switcher.md +++ b/docs/administration/back_office/content_tab_switcher.md @@ -1,3 +1,7 @@ +--- +description: Tabs switcher allows separating the default field types in the content type from the field types that enhance the content with new functionalities. +--- + # Tab switcher in content edit page Tabs switcher allows separating the default field types in the content type from the field types that enhance the content with new functionalities. @@ -32,8 +36,8 @@ ibexa: ### Configure field groups for Meta tab -The default configuration makes the `ibexa_taxonomy_entry_assignment` field always visible in the Meta tab in the content form. -With this new feature, you can indicate what field types, previously set in the back office content type, are shown in the Meta tab section in the content form. +The default configuration makes the `ibexa_taxonomy_entry_assignment` field always visible in the Meta tab in the content form. +With this new feature, you can indicate what field types, previously set in the back office content type, are shown in the Meta tab section in the content form. You can automatically move all field types from Metadata group to the Meta tab in the content form. To do it, use the following configuration: @@ -62,7 +66,7 @@ ibexa: ``` -The `meta_field_groups_list` configuration can be easily overriden. +The `meta_field_groups_list` configuration can be overriden. ## Add custom tab diff --git a/docs/administration/back_office/content_type_anchor_menu.md b/docs/administration/back_office/content_type_anchor_menu.md index c802bb2d6d..4389949d3b 100644 --- a/docs/administration/back_office/content_type_anchor_menu.md +++ b/docs/administration/back_office/content_type_anchor_menu.md @@ -4,10 +4,8 @@ description: Add anchor menu to the content type configuration screen, to make f # Add anchor menu to content type edit screen -With the anchor menu you can increase visibility of certain [field types](field_types.md), which provide more complex functionality, -by separating them from the [field definitions](content_types.md#field-definitions) section in [content type](content_types.md) configuration screen. -One example of such field type would be [SEO]([[= user_doc =]]/search_engine_optimization/work_with_seo/), -because it handles functionality that applies to all content items of the content type. +With the anchor menu you can increase visibility of certain [field types](field_types.md), which provide more complex functionality, by separating them from the [field definitions](content_types.md#field-definitions) section in [content type](content_types.md) configuration screen. +One example of such field type would be [SEO]([[= user_doc =]]/search_engine_optimization/work_with_seo/), because it handles functionality that applies to all content items of the content type. You can use the anchor menu feature with other field types, including [custom ones](create_custom_generic_field_type.md). See the following example to learn how you can add a field type as an anchor menu. @@ -31,16 +29,17 @@ ibexa: Where keys have the following meaning: -- `field_type_identifier` - replace this key with an identifier of the field type that you want to make more prominent. In case of SEO, this key is `ibexa_seo`. +- `field_type_identifier` - replace this key with an identifier of the field type that you want to make more prominent. +In case of SEO, this key is `ibexa_seo`. - `meta` - when this flag is set to `true`, it separates the field type from the **Field definitions** section and puts it in an anchor menu - `position` - decides about the field type's position on the content type edit screen and in the content item, in relation to other field types -Additionally, setting `meta` to `true` adds a toggle for enabling or disabling the field type. +Additionally, setting `meta` to `true` adds a toggle for enabling or disabling the field type. In case of SEO, it adds the **Enable SEO for this content type** toggle. -Enable the toggle to display the SEO section on the content item edit page. +Enable the toggle to display the SEO section on the content item edit page. ![SEO anchor menu](content_type_edit_screen_anchor_menu.png) !!! note - If you add multiple field types as anchor menus, they're automatically displayed as separate sections. + If you add multiple field types as anchor menus, they're automatically displayed as separate sections. diff --git a/docs/administration/back_office/customize_calendar.md b/docs/administration/back_office/customize_calendar.md index 46df5d8c10..b3def31e15 100644 --- a/docs/administration/back_office/customize_calendar.md +++ b/docs/administration/back_office/customize_calendar.md @@ -75,9 +75,9 @@ To add an in-memory collection as an event source, create `src/Calendar/Holidays !!! note When creating the list of events, you must list all the `createEvent()` entities chronologically. - + For example: - + ``` php $collection = new EventCollection([ $this->createEvent("Event 1", new DateTime("2024-01-01")), diff --git a/docs/administration/back_office/subitems_list.md b/docs/administration/back_office/subitems_list.md index 23de941093..9b4a2366c5 100644 --- a/docs/administration/back_office/subitems_list.md +++ b/docs/administration/back_office/subitems_list.md @@ -9,8 +9,7 @@ It provides an interface for listing the sub-items of any Location. !!! caution - If you want to load the Sub-items module, you need to load the JS code for it in your view, - as it's not available by default. + If you want to load the Sub-items module, you need to load the JS code for it in your view, as it's not available by default. ## Use sub-items list @@ -47,7 +46,9 @@ const attrs = { ## Properties list -The `` module can handle additional properties. There are two types of properties: **required** and **optional**. All of them are listed below. +The `` module can handle additional properties. +There are two types of properties: **required** and **optional**. +All of them are listed below. ### Required props @@ -106,5 +107,4 @@ Optionally, Sub-items module can take a following list of props: To add a Sub-items list on a page that does not have the (right) action sidebar, you need to do one of the following things: - add a `
` element with the `.ibexa-extra-actions-container` selector -- change the selector in the Sub-items settings by sending the `languageContainerSelector` prop -which takes the selector for the element that renders the `languageSelector`. +- change the selector in the Sub-items settings by sending the `languageContainerSelector` prop which takes the selector for the element that renders the `languageSelector`. diff --git a/docs/administration/configuration/configuration.md b/docs/administration/configuration/configuration.md index 99ac169b26..c40c0b1a49 100644 --- a/docs/administration/configuration/configuration.md +++ b/docs/administration/configuration/configuration.md @@ -15,14 +15,12 @@ However, you can also use XML or PHP formats for configuration. ### Configuration files Configuration files are located in the `config` folder. -Configuration is provided per package in the `config/packages` folder, -and routes are defined per package in `config/routes`. +Configuration is provided per package in the `config/packages` folder, and routes are defined per package in `config/routes`. `config/packages/ibexa.yaml` contains basic configuration. It stores, among others, [SiteAccess](multisite.md) information and content view config. -Other configuration is provided in respective files, e.g. `config/packages/ibexa_admin_ui.yaml`, -`config/packages/ibexa_http_cache.yaml`. +Other configuration is provided in respective files, e.g. `config/packages/ibexa_admin_ui.yaml`, `config/packages/ibexa_http_cache.yaml`. Configuration can be made environment-specific using separate folders for each environment. These files contain additional settings and point to the general (not environment-specific) configuration that is applied in other cases. @@ -57,8 +55,7 @@ You can define key/value pairs in your configuration files. Internally and by convention, keys follow a *dot syntax*, where the different segments follow your configuration hierarchy. Keys are usually prefixed by a *namespace* corresponding to your application. All kinds of values are accepted, including arrays and deep hashes. -For configuration that is meant to be exposed to an end-user (or end-developer), -it's usually a good idea to also [implement semantic configuration]([[= symfony_doc =]]/components/config/definition.html). +For configuration that is meant to be exposed to an end-user (or end-developer), it's usually a good idea to also [implement semantic configuration]([[= symfony_doc =]]/components/config/definition.html). Note that you can also [implement SiteAccess-aware semantic configuration](siteaccess_aware_configuration.md). diff --git a/docs/administration/configuration/dynamic_configuration.md b/docs/administration/configuration/dynamic_configuration.md index c8a37b5e43..7e9cad798c 100644 --- a/docs/administration/configuration/dynamic_configuration.md +++ b/docs/administration/configuration/dynamic_configuration.md @@ -27,8 +27,7 @@ parameters: myapp.default.my_param: Default value ``` -Inside a controller, in `site_group` SiteAccess, you can use the parameters in the following way -(note that the same applies for `hasParameter()`): +Inside a controller, in `site_group` SiteAccess, you can use the parameters in the following way (the same applies for `hasParameter()`): ``` php $configResolver = $this->getConfigResolver(); @@ -77,7 +76,7 @@ You can also use the [autowire feature]([[= symfony_doc =]]/service_container/au !!! note - Do not store the retrieved config value unless you know what you're doing. + Do not store the retrieved config value unless you know what you're doing. SiteAccess can change during code execution, which means you might work on the wrong value. ``` php diff --git a/docs/administration/configuration/repository_configuration.md b/docs/administration/configuration/repository_configuration.md index b0d0d59881..1c68fc64bb 100644 --- a/docs/administration/configuration/repository_configuration.md +++ b/docs/administration/configuration/repository_configuration.md @@ -30,8 +30,7 @@ ibexa: Database settings are supplied by [DoctrineBundle](https://github.com/doctrine/DoctrineBundle). As such, you can refer to [DoctrineBundle's documentation](https://github.com/doctrine/DoctrineBundle/blob/2.7.x/Resources/doc/configuration.rst#doctrine-dbal-configuration). -If no Repository is specified for a SiteAccess or SiteAccess group, -the first Repository defined under `ibexa.repositories` is used: +If no Repository is specified for a SiteAccess or SiteAccess group, the first Repository defined under `ibexa.repositories` is used: ``` yaml ibexa: @@ -59,9 +58,7 @@ But the following configuration would be invalid: - `ibexa.co` domain can use `ibexa_repo` - `ibexa.co/doc` **cannot** use `doc_repo`, as it's under the same domain. -Invalid configuration causes problems for different parts of the system, -for example back-end UI, REST interface and other non-SiteAccess-aware Symfony routes -such as `/_fos_user_context_hash` used by [HTTP cache](http_cache.md). +Invalid configuration causes problems for different parts of the system, for example back-end UI, REST interface, and other non-SiteAccess-aware Symfony routes such as `/_fos_user_context_hash` used by [HTTP cache](http_cache.md). ### Entity manager @@ -83,8 +80,7 @@ ibexa: prefix: Ibexa\Bundle\Core\Entity ``` -Refer to [DoctrineBundle documentation](https://symfony.com/doc/3.4/reference/configuration/doctrine.html) -for more information. +Refer to [DoctrineBundle documentation](https://symfony.com/doc/3.4/reference/configuration/doctrine.html) for more information. !!! note @@ -119,8 +115,8 @@ doctrine: ibexa: repositories: - first_repository: - storage: + first_repository: + storage: engine: legacy connection: my_connection_name config: {} @@ -135,7 +131,7 @@ ibexa: search: connection: my_second_connection_name another_repository: - storage: + storage: engine: legacy connection: another_connection_name config: {} @@ -200,8 +196,7 @@ This limit is enforced on publishing a new version and only covers archived vers Don't set `default_version_archive_limit` too high. In Legacy storage engine you can see performance degradation if you store too many versions. - The default value of 5 is the recommended value, but the less content you have overall, - the more you can increase this to, for instance, 25 or even 50. + The default value of 5 is the recommended value, but the less content you have overall, the more you can increase this to, for instance, 25 or even 50. ### Removing versions on publication @@ -218,8 +213,7 @@ ibexa: `remove_archived_versions_on_publish` is set to `true` by default. Set it to `false` if you have multiple older versions of content and need to avoid performance drops when publishing. -When you set the value to `false`, run [`ibexa:content:cleanup-versions`](#removing-old-versions) periodically -to make sure that content item versions that exceed the limit are removed. +When you set the value to `false`, run [`ibexa:content:cleanup-versions`](#removing-old-versions) periodically to make sure that content item versions that exceed the limit are removed. ### Removing old versions @@ -230,7 +224,7 @@ The command takes the following optional parameters: - `status` or `t` - status of versions to remove: `draft`, `archived` or `all` - `keep` or `k` - number of versions to keep - `user` or `u` - the User that the command is performed as. The User must have the `content/remove`, `content/read` and `content/versionread` policies. By default the `administrator` user is applied. -- `excluded-content-types` - exclude versions of one or multiple content types from the cleanup procedure; separate multiple content types identifiers with the comma. +- `excluded-content-types` - exclude versions of one or multiple content types from the cleanup procedure and separate multiple content types identifiers with the comma. `ibexa:content:cleanup-versions --status --keep --user --excluded-content-types article,blog_post` @@ -269,8 +263,7 @@ ibexa: ## Content Scheduler snapshots Content Scheduler snapshots speed up the rendering of Content Scheduler blocks and reduce the space used in the database. -By default, five snapshots are stored, but you can modify this number with the following configuration, -depending on the complexity of the Content Scheduler blocks: +By default, five snapshots are stored, but you can modify this number with the following configuration, depending on the complexity of the Content Scheduler blocks: ``` yaml parameters: @@ -285,8 +278,7 @@ This enables you to use different settings for different Repositories. !!! tip "SiteAccess-aware configuration" - If you need to use different settings per SiteAccess, not per Repository, - see [SiteAccess-aware configuration](siteaccess_aware_configuration.md). + If you need to use different settings per SiteAccess, not per Repository, see [SiteAccess-aware configuration](siteaccess_aware_configuration.md). To do this, create a parser that implements `Ibexa\Bundle\Core\DependencyInjection\Configuration\RepositoryConfigParserInterface`: diff --git a/docs/administration/content_organization/content_types.md b/docs/administration/content_organization/content_types.md index 72a793e3ff..7aae698f9a 100644 --- a/docs/administration/content_organization/content_types.md +++ b/docs/administration/content_organization/content_types.md @@ -9,9 +9,9 @@ It defines what fields are available in the content item. ![Content types](admin_panel_content_types.png "Content types") -For example, a new content type called *Article* can have fields such as title, author, body, image, etc. +For example, a new content type called *Article* can have fields such as title, author, body, or image. Based on this content type, you can create any number of content items. -content types are organized into groups. +Content types are organized into groups. ![Content type groups](admin_panel_content_type_groups.png "Content type groups") @@ -24,24 +24,33 @@ For a detailed overview of the content model, see [Content model overview](conte Each content type is characterized by a set of metadata which define the general behavior of its instances: -**Name** – a user-friendly name that describes the content type. This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces and special characters; the maximum length is 255 characters. (Mandatory.) +**Name** – a user-friendly name that describes the content type. This name is used in the interface, but not internally by the system. +It can consist of letters, digits, spaces, and special characters (it's mandatory and the maximum length is 255 characters). !!! note Note that even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), do not confuse it with this Name, which is a piece of metadata, not a field. -**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It must be unique, can only contain lowercase letters, digits and underscores; the maximum length is 50 characters. (Mandatory.) +**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. +It must be unique, can only contain lowercase letters, digits, and underscores (it's mandatory and the maximum length is 50 characters). -**Description** – a detailed description of the content type. (Optional.) +**Description** – a detailed description of the content type (optional). -**Content name pattern** – a pattern that defines what name a new content item based on this content type gets. The pattern usually consists of field identifiers that tell the system which fields it should use when generating the name of a content item. Each field identifier has to be surrounded with angle brackets. Text outside the angle brackets is included literally. If no pattern is provided, the system automatically uses the first field. (Optional.) +**Content name pattern** – a pattern that defines what name a new content item based on this content type gets. +The pattern usually consists of field identifiers that tell the system which fields it should use when generating the name of a content item. +Each field identifier has to be surrounded with angle brackets. +Text outside the angle brackets is included literally. +If no pattern is provided, the system automatically uses the first field (optional). -**URL alias name pattern** – a pattern which controls how the virtual URLs of the Locations are generated when content items are created based on this content type. Note that only the last part of the virtual URL is affected. The pattern works in the same way as the content name pattern. Text outside the angle brackets is converted using the selected method of URL transformation. If no pattern is provided, the system automatically uses the name of the content item itself. (Optional.) +**URL alias name pattern** – a pattern which controls how the virtual URLs of the Locations are generated when content items are created based on this content type. +Only the last part of the virtual URL is affected. +The pattern works in the same way as the content name pattern. +Text outside the angle brackets is converted using the selected method of URL transformation. +If no pattern is provided, the system automatically uses the name of the content item itself (optional). !!! tip "Changing URL alias and content name patterns" - If you change the content name pattern or the URL alias name pattern, - existing content items cannot be modified automatically. + If you change the content name pattern or the URL alias name pattern, existing content items cannot be modified automatically. The new pattern is only applied after you modify the content item and save a new version. The old URL aliases continue to redirect to the same content items. @@ -50,13 +59,17 @@ Each content type is characterized by a set of metadata which define the general !!! note - This flag was added for convenience and only affects the interface. In other words, it doesn't control any actual low-level logic, it simply controls the way the graphical user interface behaves. + This flag was added for convenience and only affects the interface. + In other words, it doesn't control any actual low-level logic, it simply controls the way the graphical user interface behaves. -**Sort children by default by** – rule for sorting sub-items. If the instances of this content type can serve as containers, their children are sorted according to what is selected here. +**Sort children by default by** – rule for sorting sub-items. +If the instances of this content type can serve as containers, their children are sorted according to what is selected here. -**Sort children by default in order** – another rule for sorting sub-items. This decides the sort order for the criterion chosen above. +**Sort children by default in order** – another rule for sorting sub-items. +This decides the sort order for the criterion chosen above. -**Make content available even with missing translations** – a flag which indicates if content items of this content type should be available even without a corresponding language version. See [Content availability](content_availability.md). +**Make content available even with missing translations** – a flag which indicates if content items of this content type should be available even without a corresponding language version. +See [Content availability](content_availability.md). ![Creating a new content type](admin_panel_new_content_type.png) @@ -71,12 +84,13 @@ They determine what fields of what field types are included in all content items !!! note - You can assign each field defined in a content type to a group by selecting one of the groups in the Category drop-down. [Available groups can be configured in the content repository](repository_configuration.md). + You can assign each field defined in a content type to a group by selecting one of the groups in the Category drop-down. + [Available groups can be configured in the content repository](repository_configuration.md). !!! caution In case of content types containing many field types you should be aware of possible memory-related issues with publishing/editing. - they're caused by the limitation of how many `$_POST` input variables can be accepted. + They're caused by the limitation of how many `$_POST` input variables can be accepted. The easiest way to fix them is by increasing the `max_input_vars` value in the `php.ini` configuration file. Note that this solution isn't universally recommended and you're proceeding on your own risk. @@ -87,8 +101,7 @@ They determine what fields of what field types are included in all content items ## Modifying content types -A content type and its field definitions can be modified after creation, -even if there are already content items based on it in the system. +A content type and its field definitions can be modified after creation, even if there are already content items based on it in the system. When a content type is modified, each of its instances are changed as well. If a new field definition is added to a content type, this field appears (empty) in every relevant content item. If a field definition is deleted from the content type, all the corresponding fields are removed from content items of this type. @@ -97,8 +110,7 @@ If a field definition is deleted from the content type, all the corresponding fi System content types are by default used for the File Uploads and removing them can cause errors. -If you decide to remove a `file` or `image` content type, or change their identifiers, -you need to change the configuration, so it reflects the available content types. +If you decide to remove a `file` or `image` content type, or change their identifiers, you need to change the configuration, so it reflects the available content types. Example configuration: diff --git a/docs/administration/content_organization/sections.md b/docs/administration/content_organization/sections.md index e2371a55ca..7d65f7b7f0 100644 --- a/docs/administration/content_organization/sections.md +++ b/docs/administration/content_organization/sections.md @@ -4,23 +4,26 @@ description: Sections are used to divide content items in the tree. ## Sections -Sections are used to divide content items in the tree into groups that are more easily manageable by content editors. +Sections are used to divide content items in the tree into groups that are more manageable by content editors. Division into Sections allows you, among others, to set [permissions](permission_overview.md) for only a part of the tree. ![Sections screen](admin_panel_sections.png "Sections screen") -Technically, a Section is a number, a name and an identifier. +Technically, a Section is a number, a name, and an identifier. Content items are placed in Sections by being assigned the Section ID. One item can be in only one Section. When a new content item is created, its Section ID is set to the default Section (which is usually Standard). -When the item is published it is assigned to the same Section as its parent. Because content must always be in a Section, unassigning happens by choosing a different Section to move it into. +When the item is published it is assigned to the same Section as its parent. +Because content must always be in a Section, unassigning happens by choosing a different Section to move it into. If a content item has multiple Location assignments then it is always the Section ID of the item referenced by the parent of the main Location that is used. In addition, if the main Location of a content item with multiple Location assignments is changed then the Section ID of that item is updated. When content is moved to a different Location, the item itself and all of its subtree are assigned to the Section of the new Location. -It works only for copy and move; assigning a new Section to a parent content item does not affect the subtree, meaning that subtree cannot currently be updated this way. +It works only for copy and move. +Assigning a new Section to a parent content item does not affect the subtree, meaning that subtree cannot currently be updated this way. -Sections can only be removed if no content items are assigned to them. Even then, it should be done carefully. +Sections can only be removed if no content items are assigned to them. +Even then, it should be done carefully. When a Section is deleted, it's only its definition itself that is removed. Other references to the Section remain and thus the system most likely loses consistency. @@ -34,5 +37,4 @@ Section ID numbers aren't recycled. If a Section is removed, its ID number canno Registration form for your website is placed under this address: /register. By default, new users created in this way are placed in the Guest accounts group. -To give your users a possibility to register themselves, follow the instructions -on [enabling account registration](8_enable_account_registration.md). \ No newline at end of file +To give your users a possibility to register themselves, follow the instructions on [enabling account registration](8_enable_account_registration.md). \ No newline at end of file diff --git a/docs/administration/dashboard/configure_default_dashboard.md b/docs/administration/dashboard/configure_default_dashboard.md index 7b3c181000..cbfbf89153 100644 --- a/docs/administration/dashboard/configure_default_dashboard.md +++ b/docs/administration/dashboard/configure_default_dashboard.md @@ -32,27 +32,29 @@ All the settings in the configuration are reflected in the back office. ## Container remote ID Defines starting location container for all the dashboards, including customized and predifined ones. -You can see it in the Admin panel, **Dashboards** section, **Dashboards** folder in the content tree. In the **Technical details** tab, it is defined as **Location remote ID**. +You can see it in the Admin panel, **Dashboards** section, **Dashboards** folder in the content tree. +In the **Technical details** tab, it is defined as **Location remote ID**. ![Container remote ID](dashboard_container_remote_id.png) ## Default dashboard remote ID -Specifies default predefined dashboard. This is the dashboard that all the users see as a starting dashboard in the back office. +Specifies default predefined dashboard. +All the users can see this dashboard as a starting dashboard in the back office. You can see it in the Admin panel, **Dashboards** section, **Default dashboard** folder inside of **Predefined dashboards** container in the content tree. -In the **Technical details** tab, it is defined as **Location remote ID**. +In the **Technical details** tab, it's defined as **Location remote ID**. ## Users container remote ID Defines a container for users folders, which contain all customized dashboards. You can see it in the Admin panel, **Dashboards** section, **User dashboards** folder inside of main **Dashboards** container in the content tree. -In the **Technical details** tab, it is defined as **Location remote ID**. +In the **Technical details** tab, it's defined as **Location remote ID**. ## Predefined container remote ID Defines a container that contains all predefined dashboards created by Administrator. You can see it in the Admin panel, **Dashboards** section, **Predefined dashboards** folder inside of main **Dashboards** container in the content tree. -In the **Technical details** tab, it is defined as **Location remote ID**. +In the **Technical details** tab, it's defined as **Location remote ID**. ## Section identifier diff --git a/docs/administration/project_organization/architecture.md b/docs/administration/project_organization/architecture.md index 89b12da3bb..6e95964a6d 100644 --- a/docs/administration/project_organization/architecture.md +++ b/docs/administration/project_organization/architecture.md @@ -4,10 +4,10 @@ description: Ibexa DXP architecture is structured in multiple layers connected b # Architecture -[[= product_name =]] architecture is based on the philosophy to **use APIs** that is maintained in the long term. This **makes upgrades easier and provides lossless couplings** between all parts of the architecture, at the same time improving the migration capabilities of the system. +[[= product_name =]] architecture is based on the philosophy to **use APIs** that is maintained in the long term. +This **makes upgrades easier and provides lossless couplings** between all parts of the architecture, at the same time improving the migration capabilities of the system. -The structure of an [[= product_name =]] app is based on the Symfony framework -but content management functions rely on the public PHP API. +The structure of an [[= product_name =]] app is based on the Symfony framework but content management functions rely on the public PHP API. Other applications integrate with [[= product_name =]] via REST API, which also relies on the public PHP API. ![Architecture](architecture.png "Architecture") diff --git a/docs/administration/project_organization/bundles.md b/docs/administration/project_organization/bundles.md index 0ca296614f..6c4ee0d029 100644 --- a/docs/administration/project_organization/bundles.md +++ b/docs/administration/project_organization/bundles.md @@ -10,15 +10,13 @@ You can [create bundles yourself](package_structure.md) or make use of available You can also reuse the bundles you create in other projects or share them with the community. Many [[= product_name =]] functionalities are provided through separate bundles included in the installation. -You can see the bundles that are automatically installed with [[= product_name =]] -in the respective `composer.json` files. +You can see the bundles that are automatically installed with [[= product_name =]] in the respective `composer.json` files. For example, for [[= product_name_headless =]], see the [JSON file on GitHub](https://github.com/ibexa/headless/blob/master/composer.json). !!! caution "Deprecated legacy Commerce bundles" - As of [[= product_name =]] v4.4 all `ibexa/commerce` packages are deprecated. - they're gradually replaced by their revamped counterparts and removed - completely from the product in version v5.0. + As of [[= product_name =]] v4.4 all `ibexa/commerce` packages are deprecated. + they're gradually replaced by their revamped counterparts and removed completely from the product in version v5.0. ## Working with bundles @@ -29,14 +27,13 @@ To learn how to create your own bundles, see [Symfony documentation on bundles]( ### Overriding third-party bundles -When you use an external bundle, you can override its parts, such as templates, controllers, etc. +When you use an external bundle, you can override its parts, such as templates or controllers. To do so, make use of [Symfony's bundle override mechanism]([[= symfony_doc =]]/bundles/override.html). -Note that when overriding files, the path inside your application has to correspond to the path inside the bundle. +When overriding files, the path inside your application has to correspond to the path inside the bundle. ### Removing bundles -To remove a bundle (either one you created yourself, or an out-of-the-box one that you do not need), -see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc. +To remove a bundle (either one you created yourself, or an out-of-the-box one that you do not need), see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc. ## Core packages diff --git a/docs/administration/project_organization/project_organization.md b/docs/administration/project_organization/project_organization.md index d8c0b01217..165042989e 100644 --- a/docs/administration/project_organization/project_organization.md +++ b/docs/administration/project_organization/project_organization.md @@ -6,13 +6,13 @@ description: An Ibexa DXP project follows Symfony's directory structure to organ [[= product_name =]] is a Symfony application and follows the project structure used by Symfony. -You can see an example of organizing a simple project in the [companion repository](https://github.com/ezsystems/ezplatform-ee-beginner-tutorial/tree/v3-master) for the [Beginner tutorial](page_and_form_tutorial.md). +You can see an example of organizing a project in the [companion repository](https://github.com/ezsystems/ezplatform-ee-beginner-tutorial/tree/v3-master) for the [Beginner tutorial](page_and_form_tutorial.md). ## PHP code The project's PHP code (controllers, event listeners, etc.) should be placed in the `src` folder. -Reusable libraries should be packaged so that they can easily be managed using Composer. +Reusable libraries should be packaged so that they can be managed using Composer. ## Templates @@ -23,7 +23,6 @@ They can then be referenced in code without any prefix, for example `templates/ ## Assets Project assets should go into the `assets` folder. - They can be referenced as relative to the root, for example `assets/js/script.js` can be referenced as `js/script.js` from templates. All project assets are accessible through the `assets` path. @@ -32,7 +31,7 @@ All project assets are accessible through the `assets` path. If you ever remove the `assets` folder manually, you need to dump translations before performing the `yarn encore ` command: - + ``` php bin/console bazinga:js-translation:dump assets --merge-domains ``` @@ -44,8 +43,7 @@ See [Configuration](configuration.md) for more information. ### Importing configuration from a bundle -If you're keeping some of your code in a bundle, dealing with core bundle semantic configuration can be tedious -if you maintain it in the main `config/packages/ibexa.yaml` configuration file. +If you're keeping some of your code in a bundle, dealing with core bundle semantic configuration can be tedious if you maintain it in the main `config/packages/ibexa.yaml` configuration file. You can import configuration from a bundle by following the Symfony tutorial [How to Import Configuration Files/Resources]([[= symfony_doc =]]/service_container/import.html). diff --git a/docs/administration/recent_activity/recent_activity.md b/docs/administration/recent_activity/recent_activity.md index ab34820444..ad7e786ee5 100644 --- a/docs/administration/recent_activity/recent_activity.md +++ b/docs/administration/recent_activity/recent_activity.md @@ -15,7 +15,7 @@ To learn more about its back office usage and the actions logged by default, see With some configuration, you can customize the log length in the database or on screen. A command maintains the log size in database, it should be scheduled through CRON. -- The configuration `ibexa.system..activity_log.pagination.activity_logs_limit` sets the number of log items shown per page in the back office (default value: 25). +- The configuration `ibexa.system..activity_log.pagination.activity_logs_limit` sets the number of log items shown per page in the back office (default value: 25). A log item is a group of entries, or an entry without group. - The configuration `ibexa.repositories..activity_log.truncate_after_days` sets the number of days a log entry is kept before it's deleted by the `ibexa:activity-log:truncate` command (default value: 30 days). @@ -60,11 +60,9 @@ This policy is required to view [activity log in user profile]([[= user_doc =]]/ A username of the User who performs the action is logged. When acting through the web server, the User's IP address is also logged. Other access, such as console commands, doesn't log an IP. - Your Data Protection Officer or GDPR representative should be aware of this, - so they can ensure users are informed if needed, depending on your use case, jurisdiction, and company policy. + Your Data Protection Officer or GDPR representative should be aware of this, so they can ensure users are informed if needed, depending on your use case, jurisdiction, and company policy. - For example, if a content edition feature, such as reader's comments, is available in the front office, - the recent activity log records the front users' IPs. + For example, if a content edition feature, such as reader's comments, is available in the front office, the recent activity log records the front users' IPs. ## PHP API @@ -208,7 +206,7 @@ Other actions are displayed after you click the **Show more** button. #### Display log entries -To display your log entry, if your object's PHP class isn't already covered, you'll have to: +To display your log entry, if your object's PHP class isn't already covered, you have to: - implement `ClassNameMapperInterface` to associate the class name with an identifier, - eventually create a `PostActivityListLoadEvent` subscriber if you need to load the object for the template, diff --git a/docs/api/api.md b/docs/api/api.md index 813a5edae7..6b0aa274b7 100644 --- a/docs/api/api.md +++ b/docs/api/api.md @@ -10,5 +10,5 @@ page_type: landing_page [[= cards([ "api/rest_api/rest_api_usage/rest_api_usage", "api/php_api/php_api", - "api/graphql/graphql", + "api/graphql/graphql" ], columns=3) =]] diff --git a/docs/api/graphql/graphql.md b/docs/api/graphql/graphql.md index 13cab741aa..da5759be2c 100644 --- a/docs/api/graphql/graphql.md +++ b/docs/api/graphql/graphql.md @@ -20,13 +20,11 @@ php bin/console cache:clear ``` YAML files with the schema are located in `config/graphql/types/ibexa`. -They contain information about the domain objects and the fields -you can [query](graphql_queries.md) and [operate on](graphql_operations.md). +They contain information about the domain objects and the fields you can [query](graphql_queries.md) and [operate on](graphql_operations.md). ### Schema generation limitations -GraphQL schema cannot be generated for names that do not follow the [GraphQL specification](http://spec.graphql.org/June2018/#sec-Names), -for example names that start with a digit. +GraphQL schema cannot be generated for names that do not follow the [GraphQL specification](http://spec.graphql.org/June2018/#sec-Names), for example names that start with a digit. This concerns image variations, content types, content type groups, product types, and field definition identifiers. @@ -36,29 +34,25 @@ To find identifiers that aren't included in the schema, look for "Skipped schema ## Domain schema -GraphQL for [[= product_name =]] is based on the content types (including product types), content type groups, and content items -defined in the Repository. +GraphQL for [[= product_name =]] is based on the content types (including product types), content type groups, and content items defined in the repository. For each content type the schema exposes a singular and plural field, e.g. `article` and `articles`. -Use the singular field to query a single content item, and the plural to get a whole `Connection` -(a list of content items that supports pagination). +Use the singular field to query a single content item, and the plural to get a whole `Connection` (a list of content items that supports pagination). With the queries you can inspect: -- the existing types +- the existing types - details of content types, and their fields in the context of developing your own application -You can request additional content information such as the Section or Objects states, -available under the `_info` field. +You can request additional content information such as the Section or Objects states, available under the `_info` field. You can also query content type and content type group information through the `_info` and `_types` fields. ### Repository schema -The repository schema, accessed through `_repository`, exposes the [[= product_name =]] Repository -in a manner similar to the [Public PHP API](php_api.md). +The repository schema, accessed through `_repository`, exposes the [[= product_name =]] repository in a manner similar to the [Public PHP API](php_api.md). -The `_repository` field also enables you to query e.g. Object states configured for the Repository. +The `_repository` field also enables you to query e.g. Object states configured for the repository. ### Custom schemas @@ -69,8 +63,7 @@ You can also use your own [custom schema](graphql_customization.md#custom-schema GraphQL is SiteAccess-aware, but can have only one schema per installation. This means you cannot use GraphQL with multiple repositories. -When you request a URL from a SiteAccess that is different than the current one, -the API generates it for the content item's SiteAccess, with an absolute URL if necessary. +When you request a URL from a SiteAccess that is different than the current one, the API generates it for the content item's SiteAccess, with an absolute URL if necessary. ## Authentication @@ -79,8 +72,7 @@ You can get your session cookie by logging in through the interface or through a ### JWT authentication -If you have [JWT authentication](development_security.md#jwt-authentication) enabled, -you can use the following query to get your authentication token: +If you have [JWT authentication](development_security.md#jwt-authentication) enabled, you can use the following query to get your authentication token: ``` mutation CreateToken { @@ -113,7 +105,7 @@ You can access GraphQL with `/graphql`. The [GraphiQL interactive client](https://github.com/graphql/graphiql) is included in the installation. Access it through `/graphiql`. -Here you can run your queries and preview the results in an easy-to-read format. +Here you can run your queries and preview the results in a readable format. ### Reference diff --git a/docs/api/graphql/graphql_custom_ft.md b/docs/api/graphql/graphql_custom_ft.md index e236c1f40d..c7f4b6920d 100644 --- a/docs/api/graphql/graphql_custom_ft.md +++ b/docs/api/graphql/graphql_custom_ft.md @@ -21,9 +21,8 @@ There are two ways of mapping a custom field type: - custom `FieldDefinitionMapper` You need to write a custom `FieldDefinitionMapper` if the field definition settings and constraints impact how it's mapped to GraphQL. -For example, the selection field type has a "multiple" option. -If set to false, it accepts and returns a single value, -but if set to true, it accepts and returns an array of values. +For example, the selection field type has a "multiple" option. +If set to false, it accepts and returns a single value, but if set to true, it accepts and returns an array of values. If your field definition doesn't require additional clarifications, you can map it with configuration. @@ -34,8 +33,10 @@ To map a custom field type with configuration use a compiler pass to modify a co It's a hash that maps a field type identifier (`ezstring`) to the following entries: - `value_type` - the GraphQL type values of the custom field. It can be a native type (string, int), or a custom type. If none is specified, string is used. -- `value_resolver` - how values of this field are resolved and passed to the defined value type. If not specified, it receives the `Field` object for the field type: `field`. -- `definition_type` - the GraphQL type the field definitions is mapped to. If not specified, it uses `FieldDefinition`. +- `value_resolver` - how values of this field are resolved and passed to the defined value type. +If not specified, it receives the `Field` object for the field type: `field`. +- `definition_type` - the GraphQL type the field definitions is mapped to. +If not specified, it uses `FieldDefinition`. Compiler pass example that should be placed in `src/DependencyInjection/Compiler`: diff --git a/docs/api/graphql/graphql_customization.md b/docs/api/graphql/graphql_customization.md index b710863475..6a2c6aa5c1 100644 --- a/docs/api/graphql/graphql_customization.md +++ b/docs/api/graphql/graphql_customization.md @@ -15,10 +15,11 @@ To do so, create a `config/graphql/types/Query.types.yaml` file. It is used as t In that file, add new fields that use any custom type or custom logic you require, based on [overblog/GraphQLBundle](https://github.com/overblog/GraphQLBundle). -The custom schema should be created only after generating other schemas to avoid problems, especially if the custom schema depends on other schema elements. For example: -`Type "Domain" inherited by "Query" not found.`. +The custom schema should be created only after generating other schemas to avoid problems, especially if the custom schema depends on other schema elements. +For example, `Type "Domain" inherited by "Query" not found.`. To avoid this problem during deployment, add the generated schemas to the repository. -Update the schema in the event of any changes related to GraphQL as well as when changing the environment, for example from `dev` to `prod`. +Update the schema in the event of any changes related to GraphQL and when changing the environment, for example from `dev` to `prod`. + ### Configuration You can include the [[= product_name =]] schema in two ways: either through inheritance or composition. @@ -91,7 +92,6 @@ SomethingPayload: ## Custom field name You can customize the name used by GraphQL as the content field name. - Use this setting to avoid conflicts with field names that derive from a content type definition. ``` yaml diff --git a/docs/api/graphql/graphql_operations.md b/docs/api/graphql/graphql_operations.md index 1672be625b..b8de7a692b 100644 --- a/docs/api/graphql/graphql_operations.md +++ b/docs/api/graphql/graphql_operations.md @@ -70,7 +70,7 @@ Response: } ``` -Note that the input for updating a content item is the same as when creating it, but all fields are optional. +The input for updating a content item is the same as when creating it, but all fields are optional. ## Deleting content diff --git a/docs/api/graphql/graphql_queries.md b/docs/api/graphql/graphql_queries.md index d9d67d5fb1..49106e66f6 100644 --- a/docs/api/graphql/graphql_queries.md +++ b/docs/api/graphql/graphql_queries.md @@ -10,8 +10,7 @@ You can query a single content item or a list of content items using fields defi ### Get a content item -To get a specific content item by its content ID, Location ID, or URL alias, use its relevant singular field, -for example `article`, `folder`, `image`, etc.: +To get a specific content item by its content ID, Location ID, or URL alias, use its relevant singular field, for example `article`, `folder`, or `image`. ``` { @@ -106,7 +105,7 @@ When you do not specify a language, the response contains the most prioritized t ### Get a group of content items -To get a list of all content items of a selected type, use the plural field, e.g. `articles`: +To get a list of all content items of a selected type, use the plural field, for example, `articles`: ``` { @@ -765,8 +764,7 @@ You can paginate plural fields using `edges`: ``` This query returns the first three articles, ordered by their publication date. -If the current `Connection` (list of results) isn't finished yet and there are more items to read, -`hasNextPage` is `true`. +If the current `Connection` (list of results) isn't finished yet and there are more items to read, `hasNextPage` is `true`. For the `children` node, you can use the following pagination method: diff --git a/docs/api/php_api/php_api.md b/docs/api/php_api/php_api.md index 10ada13e14..7a85a1fa94 100644 --- a/docs/api/php_api/php_api.md +++ b/docs/api/php_api/php_api.md @@ -7,15 +7,14 @@ page_type: reference The [public PHP API](../php_api_reference/) enables you to interact with [[= product_name =]]'s Repository and content model from your PHP code. -You can use it to create, read, update, manage, and delete all objects available in [[= product_name =]], namely -content and related objects such as Sections, Locations, content types, languages, etc. +You can use it to create, read, update, manage, and delete all objects available in [[= product_name =]], namely content and related objects such as Sections, Locations, content types, or languages. The PHP API is built on top of a layered architecture, including a persistence SPI that abstracts storage. Using the API ensures that your code is forward compatible with future releases based on other storage engines. ## Using API services -The API provides access to Content, User, content types and other features through various services. +The API provides access to Content, User, content types, and other features through various services. The full list of available services covers: @@ -63,9 +62,7 @@ Those objects are divided into sub-namespaces, such as [`Content`](php_api_refer Each sub-namespace contains a set of value objects, such as [`Content\Content`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Content.html) or [`User\Role`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-User-Role.html). -Value objects come with their own properties, such as `$content->id` or `$location->hidden`, -as well as with methods that provide access to more related information, -such as [`Content\Relation::getSourceContentInfo()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Relation.html#method_getSourceContentInfo) or [`User\Role::getPolicies()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-User-Role.html#method_getPolicies). +Value objects come with their own properties, such as `$content->id` or `$location->hidden`, and with methods that provide access to more related information, such as [`Content\Relation::getSourceContentInfo()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Relation.html#method_getSourceContentInfo) or [`User\Role::getPolicies()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-User-Role.html#method_getPolicies). ### Creating and updating objects @@ -74,19 +71,15 @@ To create and modify Repository values, use data structures, such as [`ContentSe ### Value info objects -Some complex value objects have an `Info` counterpart, -for example [`ContentInfo`](https://github.com/ibexa/core/blob/main/src/contracts/Repository/Values/Content/ContentInfo.php) -for [`Content`](https://github.com/ibexa/core/blob/main/src/contracts/Repository/Values/Content/Content.php). +Some complex value objects have an `Info` counterpart, for example [`ContentInfo`](https://github.com/ibexa/core/blob/main/src/contracts/Repository/Values/Content/ContentInfo.php) for [`Content`](https://github.com/ibexa/core/blob/main/src/contracts/Repository/Values/Content/Content.php). These objects provide you with lower-level information. -For instance, `ContentInfo` contains `currentVersionNo` or `remoteId`, -while `Content` enables you to retrieve fields, content type, or previous versions. +For instance, `ContentInfo` contains `currentVersionNo` or `remoteId`, while `Content` enables you to retrieve fields, content type, or previous versions. !!! note The public PHP API value objects should not be serialized. - Serialization of value objects, for example, `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` / `Ibexa\Contracts\Core\Repository\Values\Content\VersionInfo` - or `Ibexa\Contracts\Core\Repository\Values\Content\Location` results in memory limit exceeded error. + Serialization of value objects, for example, `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` / `Ibexa\Contracts\Core\Repository\Values\Content\VersionInfo` or `Ibexa\Contracts\Core\Repository\Values\Content\Location` results in memory limit exceeded error. ## Authentication @@ -102,7 +95,7 @@ When using the PHP API, authentication is performed in three ways: ### Back office authentication When actions are performed through the back office, they're executed as the logged-in User. -This User's permissions affects the behavior of the Repository. +This User's permissions affects the behavior of the repository. The User may, for example, not be allowed to create content, or view a particular Section. ### Using `sudo()` @@ -127,11 +120,9 @@ $hiddenLocation = $repository->sudo(function (Repository $repository) use ($loca ### Setting the Repository user In a command line script, the Repository runs as if executed by the anonymous user. -While [using `sudo()`](#using-sudo) is the recommended option, -you can also set the current user to a user with necessary permissions to achieve the same effect. +While [using `sudo()`](#using-sudo) is the recommended option, you can also set the current user to a user with necessary permissions to achieve the same effect. -In order to identify as a different user, you need to use the `UserService` together with `PermissionResolver` -(in the example `admin` is the login of the administrator user): +To identify as a different user, you need to use the `UserService` together with `PermissionResolver` (in the example `admin` is the login of the administrator user): ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CreateContentCommand.php', 50, 52) =]] @@ -139,10 +130,10 @@ In order to identify as a different user, you need to use the `UserService` toge !!! tip - [`Ibexa\Contracts\Core\Repository\PermissionService`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-PermissionService.html) can be injected to have a Service which provides both `PermissionResolver` and `PermissionCriterionResolver`. It supports auto-wiring. + [`Ibexa\Contracts\Core\Repository\PermissionService`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-PermissionService.html) can be injected to have a Service which provides both `PermissionResolver` and `PermissionCriterionResolver`. + It supports auto-wiring. -This isn't required in template functions or controller code, -as the HTTP layer takes care of identifying the user, and automatically sets it in the repository. +This isn't required in template functions or controller code, as the HTTP layer takes care of identifying the user, and automatically sets it in the repository. If you want to identify a user with their credentials instead, provide them in the following way: @@ -158,8 +149,7 @@ Each API method may throw different exceptions, depending on what it does. It's good practice to cover every exception you expect to happen. -For example if you're using a command which takes the Content ID as a parameter, -the ID may either not exist, or the referenced content item may not be visible to the user. +For example if you're using a command which takes the Content ID as a parameter, the ID may either not exist, or the referenced content item may not be visible to the user. Both cases should be covered with error messages: @@ -177,12 +167,13 @@ try { [[= product_name =]] uses the [Symfony service container]([[= symfony_doc =]]/service_container.html) for dependency resolution. -[Symfony dependency injection]([[= symfony_doc =]]/components/dependency_injection.html) ensures that any required services are available in your custom code -(for example, controllers) when you inject them into the constructor. +[Symfony dependency injection]([[= symfony_doc =]]/components/dependency_injection.html) ensures that any required services are available in your custom code (for example, controllers) when you inject them into the constructor. -Symfony service container uses service tags to dedicate services to a specific purpose. they're usually used for extension points. +Symfony service container uses service tags to dedicate services to a specific purpose. +They're usually used for extension points. -[[= product_name =]] exposes multiple features using service tags. For example, field types are tagged `ibexa.field_type`. +[[= product_name =]] exposes multiple features using service tags. +For example, field types are tagged `ibexa.field_type`. !!! tip diff --git a/docs/api/rest_api/extending_rest_api/adding_custom_media_type.md b/docs/api/rest_api/extending_rest_api/adding_custom_media_type.md index b276f35d66..b3889338d6 100644 --- a/docs/api/rest_api/extending_rest_api/adding_custom_media_type.md +++ b/docs/api/rest_api/extending_rest_api/adding_custom_media_type.md @@ -10,9 +10,10 @@ By default, this resource takes an `application/vnd.ibexa.api.Location+xml` (or The following example adds the handling of a new media type `application/app.api.Location+xml` (or `+json`) `Accept` header to obtain a different response using the same controller. You need the following elements: -* A `ValueObjectVisitor` to create the new response corresponding to the new media type; -* A `ValueObjectVisitorDispatcher` to have this `ValueObjectVisitor` used to visit the default controller result; -* An `Output\Visitor` service associating this new `ValueObjectVisitorDispatcher` with the new media type. + +- `ValueObjectVisitor` - to create the new response corresponding to the new media type +- `ValueObjectVisitorDispatcher` - to have this `ValueObjectVisitor` used to visit the default controller result +- `Output\Visitor` - service associating this new `ValueObjectVisitorDispatcher` with the new media type !!! note diff --git a/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md b/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md index 857f62e7f5..d3de11e7f1 100644 --- a/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md +++ b/docs/api/rest_api/extending_rest_api/creating_new_rest_resource.md @@ -6,11 +6,11 @@ description: Extend REST API by creating a new resource. To create a new REST resource, you need to prepare: -* The REST route leading to a controller action. -* The controller and its action. -* Optionally, one or several `InputParser` objects if the controller needs to receive a payload to treat, one or several value classes to represent this payload and potentially one or several new media types to type this payload in the `Content-Type` header. -* Optionally, one or several new value classes to represent the controller action result, their `ValueObjectVisitor` to help the generator to turn this into XML or JSON and potentially one or several new media types to claim in the `Accept` header the desired value. -* Optionally, the addition of this resource route to the REST root. +- the REST route leading to a controller action +- the controller and its action +- one or several `InputParser` objects if the controller needs to receive a payload to treat, one or several value classes to represent this payload and potentially one or several new media types to type this payload in the `Content-Type` header (optional) +- one or several new value classes to represent the controller action result, their `ValueObjectVisitor` to help the generator to turn this into XML or JSON and potentially one or several new media types to claim in the `Accept` header the desired value (optional) +- the addition of this resource route to the REST root (optional) In the following example, you add a greeting resource to the REST API. It's available through `GET` and `POST` methods. `GET` sets default values while `POST` allows inputting custom values. @@ -57,8 +57,8 @@ Having the REST controllers set as services enables using features such as the ` A REST controller should: -- return a value object and have a `Generator` and `ValueObjectVisitor`s producing the XML or JSON output; -- extend `Ibexa\Rest\Server\Controller` to inherit utils methods and properties like `InputDispatcher` or `RequestParser`. +- return a value object and have a `Generator` and `ValueObjectVisitor`s producing the XML or JSON output +- extend `Ibexa\Rest\Server\Controller` to inherit utils methods and properties like `InputDispatcher` or `RequestParser` ``` php [[= include_file('code_samples/api/rest_api/src/Rest/Controller/DefaultController.php') =]] @@ -101,7 +101,8 @@ services: [[= include_file('code_samples/api/rest_api/config/services.yaml', 43, 48) =]] ``` -Here, the media type is `application/vnd.ibexa.api.Greeting` plus a format. To have a different vendor than the default, you could create a new `Output\Generator` or hard-code it in the `ValueObjectVisitor` like in the [`RestLocation` example](adding_custom_media_type.md#new-restlocation-valueobjectvisitor). +Here, the media type is `application/vnd.ibexa.api.Greeting` plus a format. +To have a different vendor than the default, you could create a new `Output\Generator` or hard-code it in the `ValueObjectVisitor` like in the [`RestLocation` example](adding_custom_media_type.md#new-restlocation-valueobjectvisitor). ## InputParser @@ -186,7 +187,9 @@ ibexa_rest: href: 'router.generate("", {routeParameter: value})' ``` -The `router.generate` renders a URI based on the name of the route and its parameters. The parameter values can be a real value or a placeholder. For example, `'router.generate("ibexa.rest.load_location", {locationPath: "1/2"})'` results in `/api/ibexa/v2/content/locations/1/2` while `'router.generate("ibexa.rest.load_location", {locationPath: "{locationPath}"})'` gives `/api/ibexa/v2/content/locations/{locationPath}`. +The `router.generate` renders a URI based on the name of the route and its parameters. +The parameter values can be a real value or a placeholder. +For example, `'router.generate("ibexa.rest.load_location", {locationPath: "1/2"})'` results in `/api/ibexa/v2/content/locations/1/2` while `'router.generate("ibexa.rest.load_location", {locationPath: "{locationPath}"})'` gives `/api/ibexa/v2/content/locations/{locationPath}`. This syntax is based on Symfony's [expression language]([[= symfony_doc =]]/components/expression_language/index.html), an extensible component that allows limited/readable scripting to be used outside the code context. In this example, `app.rest.greeting` is available in every SiteAccess (`default`): diff --git a/docs/api/rest_api/rest_api_authentication.md b/docs/api/rest_api/rest_api_authentication.md index c85cffd57e..f017b6733c 100644 --- a/docs/api/rest_api/rest_api_authentication.md +++ b/docs/api/rest_api/rest_api_authentication.md @@ -7,7 +7,7 @@ description: To authenticate REST API communication you can use session (default This page refers to [REST API reference](rest_api_reference/rest_api_reference.html), where you can find detailed information about REST API resources and endpoints. -Five authentication methods are currently supported: session (default), JWT, basic, OAuth and client certificate (SSL). +Five authentication methods are currently supported: session (default), JWT, basic, OAuth, and client certificate (SSL). You can only use one of those methods at the same time. @@ -52,7 +52,7 @@ To create a session, execute the following REST request: Accept: application/vnd.ibexa.api.Session+xml Content-Type: application/vnd.ibexa.api.SessionInput+xml ``` - + ```xml @@ -60,14 +60,14 @@ To create a session, execute the following REST request: publish ``` - + ``` HTTP/1.1 201 Created Location: /user/sessions/go327ij2cirpo59pb6rrv2a4el2 Set-Cookie: eZSESSID98defd6ee70dfb1dea416=go327ij2cirpo59pb6rrv2a4el2; domain=.example.net; path=/; expires=Wed, 13-Jan-2021 22:23:01 GMT; HttpOnly Content-Type: application/vnd.ibexa.api.Session+xml ``` - + ```xml @@ -86,7 +86,7 @@ To create a session, execute the following REST request: Accept: application/vnd.ibexa.api.Session+json Content-Type: application/vnd.ibexa.api.SessionInput+json ``` - + ```json { "SessionInput": { @@ -95,14 +95,14 @@ To create a session, execute the following REST request: } } ``` - + ``` HTTP/1.1 201 Created Location: /user/sessions/go327ij2cirpo59pb6rrv2a4el2 Set-Cookie: eZSESSID98defd6ee70dfb1dea416=go327ij2cirpo59pb6rrv2a4el2; domain=.example.net; path=/; expires=Wed, 13-Jan-2021 22:23:01 GMT; HttpOnly Content-Type: application/vnd.ibexa.api.Session+xml ``` - + ```json { "Session": { @@ -121,8 +121,7 @@ To create a session, execute the following REST request: ##### Logging in with active session -Logging in is very similar to session creation, with one important detail: -the CSRF token obtained in the previous step is added to the new request through the `X-CSRF-Token` header. +Logging in is similar to session creation, with one important detail: the CSRF token obtained in the previous step is added to the new request through the `X-CSRF-Token` header. === "XML" @@ -134,7 +133,7 @@ the CSRF token obtained in the previous step is added to the new request through Cookie: eZSESSID98defd6ee70dfb1dea416=go327ij2cirpo59pb6rrv2a4el2 X-CSRF-Token: 23lk.neri34ijajedfw39orj-3j93 ``` - + ```xml @@ -142,12 +141,12 @@ the CSRF token obtained in the previous step is added to the new request through publish ``` - + ``` HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.Session+xml ``` - + ```xml @@ -168,7 +167,7 @@ the CSRF token obtained in the previous step is added to the new request through Cookie: eZSESSID98defd6ee70dfb1dea416=go327ij2cirpo59pb6rrv2a4el2 X-CSRF-Token: 23lk.neri34ijajedfw39orj-3j93 ``` - + ```xml { "SessionInput": { @@ -177,12 +176,12 @@ the CSRF token obtained in the previous step is added to the new request through } } ``` - + ``` HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.Session+json ``` - + ```xml { "Session": { @@ -214,8 +213,7 @@ Cookie: eZSESSID98defd6ee70dfb1dea416=go327ij2cirpo59pb6rrv2a4el2 ##### CSRF token -It can be important to keep the CSRF token (`csrfToken`) for the duration of the session, -because you must send this token in every request that uses [unsafe HTTP methods](rest_requests.md#request-method) (others than the safe GET or HEAD or OPTIONS) when a session has been established. +It can be important to keep the CSRF token (`csrfToken`) for the duration of the session, because you must send this token in every request that uses [unsafe HTTP methods](rest_requests.md#request-method) (others than the safe GET or HEAD or OPTIONS) when a session has been established. It should be sent with an `X-CSRF-Token` header. Only three built-in routes can accept unsafe methods without CSRF, the sessions routes starting with `/user/sessions` to create, refresh or delete a session. @@ -270,8 +268,7 @@ See [JWT authentication](#jwt-authentication) or GraphQL. ### Usage example -After you [configure JWT authentication](development_security.md#jwt-authentication) at least for REST, -you can get the JWT token through the following request: +After you [configure JWT authentication](development_security.md#jwt-authentication) at least for REST, you can get the JWT token through the following request: === "XML" @@ -281,24 +278,24 @@ you can get the JWT token through the following request: Accept: application/vnd.ibexa.api.JWT+xml Content-Type: application/vnd.ibexa.api.JWTInput+xml ``` - + Provide the username and password in the request body: - + ```xml admin publish ``` - + If credentials are valid, the server response contains a token: - + ```xml ``` - + You can then use this token in your request instead of username and password. - + ``` GET /content/locations/1/5/children Host: @@ -314,9 +311,9 @@ you can get the JWT token through the following request: Accept: application/vnd.ibexa.api.JWT+json Content-Type: application/vnd.ibexa.api.JWTInput+json ``` - + Provide the username and password in the request body: - + ```json { "JWTInput": { @@ -325,9 +322,9 @@ you can get the JWT token through the following request: } } ``` - + If credentials are valid, the server response contains a token: - + ```json { "JWT": { @@ -336,9 +333,9 @@ you can get the JWT token through the following request: } } ``` - + You can then use this token in your request instead of username and password. - + ``` GET /content/locations/1/5/children Host: @@ -378,8 +375,8 @@ If the installation has a dedicated host for REST, you can enable HTTP basic aut Basic authentication requires the username and password to be sent *(username:password)*, base64 encoded, with each request. For details, see [RFC 2617](https://datatracker.ietf.org/doc/html/rfc2617). -Most HTTP client libraries as well as REST libraries support this method. -[Creating content with binary attachments](rest_requests.md#creating-content-with-binary-attachments) has an example using basic authentication with [cURL](https://www.php.net/manual/en/book.curl.php) and its `CURLOPT_USERPWD`. +Most HTTP client libraries and REST libraries support this method. +[Creating content with binary attachments](rest_requests.md#creating-content-with-binary-attachments) has an example using basic authentication with [cURL](https://www.php.net/manual/en/book.curl.php) and its `CURLOPT_USERPWD`. **Raw HTTP request with basic authentication** diff --git a/docs/api/rest_api/rest_api_usage/rest_api_usage.md b/docs/api/rest_api/rest_api_usage/rest_api_usage.md index f8334fe6ce..6bc9499dd0 100644 --- a/docs/api/rest_api/rest_api_usage/rest_api_usage.md +++ b/docs/api/rest_api/rest_api_usage/rest_api_usage.md @@ -1,16 +1,15 @@ --- -description: The REST API covers objects in the Ibexa DXP Repository with regular and custom HTTP methods, such as GET or PUBLISH, as well as HTTP headers. +description: The REST API covers objects in the Ibexa DXP Repository with regular and custom HTTP methods, such as GET or PUBLISH, and HTTP headers. --- # REST API usage -The REST API in [[= product_name =]] allows you to interact with an [[= product_name =]] installation using the HTTP protocol, -following a [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) interaction model. +The REST API in [[= product_name =]] allows you to interact with an [[= product_name =]] installation using the HTTP protocol, following a [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) interaction model. Each resource (URI) interacts with a part of the system (like content, users or search). Every interaction with the Repository than you can do from back office or using the [Public PHP API](php_api.md) can also be done using the REST API. -The REST API uses HTTP methods (such as `GET` and `PUBLISH`), as well as HTTP headers to specify the type of request. +The REST API uses HTTP methods (such as `GET` and `PUBLISH`), and HTTP headers to specify the type of request. ## URIs @@ -58,7 +57,7 @@ curl -H "Accept: application/json" https://api.example.com/api/ibexa/v2/ ### Country list -Alongside regular Repository interactions, there is a REST service providing a list of countries with their names, [ISO-3166](https://en.wikipedia.org/wiki/ISO_3166) codes and International Dialing Codes (IDC). It could be useful when presenting a country options list from any application. +Alongside regular Repository interactions, there is a REST service providing a list of countries with their names, [ISO-3166](https://en.wikipedia.org/wiki/ISO_3166) codes and International Dialing Codes (IDC). You can use it when presenting a country options list from any application. This country list's URI is `/services/countries`. @@ -66,7 +65,7 @@ The ISO-3166 country codes can be represented as: - two-letter code (alpha-2) — recommended as the general purpose code - three-letter code (alpha-3) — related to the country name -- three-digit numeric code (numeric-3) — useful if you need to avoid using Latin script +- three-digit numeric code (numeric-3) — use it if you need to avoid using Latin script For details, see the [ISO-3166 glossary](https://www.iso.org/glossary-for-iso-3166.html). diff --git a/docs/api/rest_api/rest_api_usage/rest_requests.md b/docs/api/rest_api/rest_api_usage/rest_requests.md index d3f0314b68..cf59e50988 100644 --- a/docs/api/rest_api/rest_api_usage/rest_requests.md +++ b/docs/api/rest_api/rest_api_usage/rest_requests.md @@ -36,8 +36,7 @@ For method action details per resource, see the [REST API reference](../rest_api !!! note "Caution with custom HTTP methods" Using custom HTTP methods can cause issues with several HTTP proxies, network firewall/security solutions and simpler web servers. - To avoid issues with this, REST API allows you to set these using the HTTP header `X-HTTP-Method-Override` alongside the standard `POST` method - instead of using a custom HTTP method. For example: `X-HTTP-Method-Override: PUBLISH` + To avoid issues with this, REST API allows you to set these using the HTTP header `X-HTTP-Method-Override` alongside the standard `POST` method instead of using a custom HTTP method. For example: `X-HTTP-Method-Override: PUBLISH` If applicable, both methods are always mentioned in the specifications. @@ -115,14 +114,14 @@ On top of methods, HTTP request headers allow you to personalize the request's b On every resource, you can use the `Accept` header to indicate which format you want to communicate in, JSON or XML. This header is also used to specify the response type you want the server to send when multiple types are available. -- `Accept: application/vnd.ibexa.api.Content+xml` to get `Content` (full data, Fields included) as **[XML](https://www.w3.org/XML/)** -- `Accept: application/vnd.ibexa.api.ContentInfo+json` to get `ContentInfo` (metadata only) as **[JSON](https://www.json.org/)** +- `Accept: application/vnd.ibexa.api.Content+xml` to get `Content` (full data, Fields included) as **[XML](https://www.w3.org/XML/)** +- `Accept: application/vnd.ibexa.api.ContentInfo+json` to get `ContentInfo` (metadata only) as **[JSON](https://www.json.org/)** Media types are also used with the [`Content-Type` header](rest_responses.md#content-type-header) to characterize a [request body](#request-body) or a [response body](rest_responses.md#response-body). See [Creating content with binary attachments](#creating-content-with-binary-attachments) below. Also see [Creating session](rest_api_authentication.md#creating-session) examples. -If the resource only returns one media type, it's also possible to skip it and to just specify the format using `application/xml` or `application/json`. +If the resource only returns one media type, it's also possible to skip it and to specify the format using `application/xml` or `application/json`. A response indicates `href`s to related resources and their media types. @@ -143,18 +142,16 @@ The `X-Expected-User` header specifies the user needed for the request execution With this header, if the current username on server side isn't equal to `X-Expected-User` value, a `401 Unauthorized` error is returned. Without this header, the request is executed with the current user who might be unexpected (like the Anonymous user if a previous authentication has expired) and an ambiguous response might be returned as a success not informing about a wrong user. -For example, it prevents a Content request to be executed with Anonymous user in the case of an expired authentication, -and the response being a `200 OK` but missing content items due to access rights difference with the expected user. +For example, it prevents a Content request to be executed with Anonymous user in the case of an expired authentication, and the response being a `200 OK` but missing content items due to access rights difference with the expected user. ## Request body -You can pass some short scalar parameters in the URIs or as GET parameters, but other resources need heavier structured payloads passed in the request body, -in particular the ones to create (`POST`) or update (`PATCH`) items. +You can pass some short scalar parameters in the URIs or as GET parameters, but other resources need heavier structured payloads passed in the request body, in particular the ones to create (`POST`) or update (`PATCH`) items. In the [REST API reference](../rest_api_reference/rest_api_reference.html), request payload examples are given when needed. One example is the [creation of an authentication session](rest_api_authentication.md#establishing-session). -When creating a content item, a special payload is needed if the ContentType has some [Image](imagefield.md) or [BinaryFile](binaryfilefield.md) Fields as files need to be attached. See the example of a [script uploading images](#creating-content-with-binary-attachments) below. +When creating a content item, a special payload is needed if the content type has some [Image](imagefield.md) or [BinaryFile](binaryfilefield.md) Fields as files need to be attached. See the example of a [script uploading images](#creating-content-with-binary-attachments) below. When searching for content items (or Locations), the query grammar is also particular. See the [Search section](#search-views) below. diff --git a/docs/api/rest_api/rest_api_usage/rest_responses.md b/docs/api/rest_api/rest_api_usage/rest_responses.md index 09d91d80da..3e12e79d5f 100644 --- a/docs/api/rest_api/rest_api_usage/rest_responses.md +++ b/docs/api/rest_api/rest_api_usage/rest_responses.md @@ -25,7 +25,7 @@ For code details per resource, see the [REST API reference](../rest_api_referenc | `409` | Conflict | The request is in conflict with another part of the repository (for example, trying to create a new item with an identifier already used). | | `415` | Unsupported Media Type | The request payload media type doesn't match the media type specified in the request header. | | `500` | Internal Server Error | The server encountered an unexpected condition, usually an exception, which prevents it from fulfilling the request, like database down, permissions or configuration error. | -| `501` | Not Implemented | Returned when the requested method hasn't yet been implemented. For [[= product_name =]], most of Users, User groups, content items, Locations and content types have been implemented. Some of their methods, as well as other features, may return a 501. | +| `501` | Not Implemented | Returned when the requested method hasn't yet been implemented. For [[= product_name =]], most of Users, User groups, content items, Locations and content types have been implemented. Some of their methods, and other features, may return a 501. | ## Response headers diff --git a/docs/api/rest_api/rest_api_usage/testing_rest_api.md b/docs/api/rest_api/rest_api_usage/testing_rest_api.md index 932252bad1..058827af62 100644 --- a/docs/api/rest_api/rest_api_usage/testing_rest_api.md +++ b/docs/api/rest_api/rest_api_usage/testing_rest_api.md @@ -32,14 +32,15 @@ Open a PHP shell in a terminal with `php -a` and copy-paste this co `$resource` URI should be edited to address the right domain. -On a freshly installed [[= product_name =]], `52` is the Content ID of the home page. If necessary, substitute `52` with the Content ID of an item from your database. +On a freshly installed [[= product_name =]], `52` is the Content ID of the home page. +If necessary, substitute `52` with the content ID of an item from your database. For a content creation example using PHP, see [Creating content with binary attachments](rest_requests.md#creating-content-with-binary-attachments) ## JS The REST API can help you implement JavaScript / AJAX interaction. -The following example of an AJAX call retrieves `ContentInfo` (that is, metadata) for a content item: +The following example of an AJAX call retrieves `ContentInfo` (that is, metadata) for a content item. To test it, copy-paste this code into your browser console alongside a page from your website (to share the domain): @@ -72,6 +73,7 @@ To test it, copy-paste this code into your browser console alongside a page from request.send(); ``` -On a freshly installed [[= product_name =]], `52` is the Content ID of the home page. If necessary, substitute `52` with the Content ID of an item from your database. +On a freshly installed [[= product_name =]], `52` is the Content ID of the home page. +If necessary, substitute `52` with the Content ID of an item from your database. You can edit the `resource` URI to address another domain, but [cross-origin requests](rest_responses.md#cross-origin) must be allowed first. diff --git a/docs/cdp/cdp_activation/cdp_activation.md b/docs/cdp/cdp_activation/cdp_activation.md index c15223bb64..16027a89d7 100644 --- a/docs/cdp/cdp_activation/cdp_activation.md +++ b/docs/cdp/cdp_activation/cdp_activation.md @@ -13,5 +13,5 @@ Activation includes configuration, data export and adding Client-side Tracking. [[= cards([ "cdp/cdp_activation/cdp_configuration", "cdp/cdp_activation/cdp_data_export", - "cdp/cdp_activation/cdp_add_clientside_tracking", + "cdp/cdp_activation/cdp_add_clientside_tracking" ], columns=3) =]] \ No newline at end of file diff --git a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md index 6abea51f78..ea1b6e829b 100644 --- a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md +++ b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md @@ -6,12 +6,11 @@ edition: experience # Add Client-side Tracking The final step is setting up a tracking script. -It requires a head tracking script between the `` tags on your website, -a main script after the head script, and cookie consent. +It requires a head tracking script between the `` tags on your website, a main script after the head script, and cookie consent. For more information about setting up a tracking script, see [a tutorial in Raptor documentation](https://support.raptorsmartadvisor.com/hc/en-us/articles/9563346335004-Client-Side-Tracking). Now, you need to add a tracker to specific places in your website where you want to track users. -For example, add this tracker to the Landing Page template to track user entrances. +For example, add this tracker to the landing page template to track user entrances. ```js raptor.trackEvent('visit', ..., ...); diff --git a/docs/commerce/cart/cart.md b/docs/commerce/cart/cart.md index d2e2dbc35d..a744429c27 100644 --- a/docs/commerce/cart/cart.md +++ b/docs/commerce/cart/cart.md @@ -1,5 +1,5 @@ --- -description: The cart component covers adding items to the shopping cart, as well as previewing and modifying the cart information. +description: The cart component covers adding items to the shopping cart, and previewing or modifying the cart information. edition: commerce --- diff --git a/docs/commerce/checkout/checkout_api.md b/docs/commerce/checkout/checkout_api.md index e1f037e350..0e7874f819 100644 --- a/docs/commerce/checkout/checkout_api.md +++ b/docs/commerce/checkout/checkout_api.md @@ -53,9 +53,7 @@ You can update the collected data after the checkout is created. The data is stored within the `CheckoutInterface::context` object. The last update time and status are also stored. -To update the checkout, use the `CheckoutServiceInterface::updateCheckout` method -and provide it with the `CheckoutUpdateStruct` struct that contains data collected at each -step of the workflow, as well as a transition name to identify what step follows. +To update the checkout, use the `CheckoutServiceInterface::updateCheckout` method and provide it with the `CheckoutUpdateStruct` struct that contains data collected at each step of the workflow, and a transition name to identify what step follows. All data is placed in session storage. diff --git a/docs/commerce/checkout/customize_checkout.md b/docs/commerce/checkout/customize_checkout.md index 5b6fe3fa5e..7768363048 100644 --- a/docs/commerce/checkout/customize_checkout.md +++ b/docs/commerce/checkout/customize_checkout.md @@ -45,7 +45,7 @@ that allows users to select their seats. ### Define workflow You can create workflow definitions under the `framework.workflows` [configuration key](configuration.md#configuration-files). -Each workflow definition consists of a series of steps as well as a series of transitions between the steps. +Each workflow definition consists of a series of steps and a series of transitions between the steps. To create a new workflow, for example, `seat_selection_checkout`, use the default workflow that comes with the storefront module as a basis, and add a `seat_selected` step. @@ -165,7 +165,7 @@ To create a one page checkout, define a workflow that has two steps, `initialize ### Create controller Add a regular Symfony controller in project code, which reuses classes provided by the application. -Within the controller, create a form that contains all the necessary fields, such as the shipping and billing addresses, as well as shipping and billing methods. +Within the controller, create a form that contains all the necessary fields, such as the shipping and billing addresses, together with shipping and billing methods. In the `src/Controller/Checkout` folder, create a file that resembles the following example: diff --git a/docs/commerce/checkout/reorder.md b/docs/commerce/checkout/reorder.md index b3d0d9d888..8a557fce59 100644 --- a/docs/commerce/checkout/reorder.md +++ b/docs/commerce/checkout/reorder.md @@ -43,7 +43,7 @@ Below, you can find a few examples that demonstrate how you can modify this feat ### Customize reorder You can modify workflow under the `framework.workflows` [configuration key](configuration.md#configuration-files). -Each workflow definition consists of a series of steps as well as a series of transitions between the steps. +Each workflow definition consists of a series of steps and a series of transitions between the steps. Below example shows how to set up `can_be_reordered` flag for specific order statuses. diff --git a/docs/commerce/order_management/order_management_api.md b/docs/commerce/order_management/order_management_api.md index 58ac2b745f..1323faf780 100644 --- a/docs/commerce/order_management/order_management_api.md +++ b/docs/commerce/order_management/order_management_api.md @@ -43,8 +43,7 @@ It follows the same search query pattern as other APIs: ## Create order -To create an order, use the `OrderService::createOrder` method and provide -it with the `Ibexa\Contracts\OrderManagement\Value\OrderCreateStruct` object that contains a list of products, purchased quantities, product and total prices, as well as tax amounts. +To create an order, use the `OrderService::createOrder` method and provide it with the `Ibexa\Contracts\OrderManagement\Value\OrderCreateStruct` object that contains a list of products, purchased quantities, product, total prices, and tax amounts. ``` php [[= include_file('code_samples/api/commerce/src/Command/OrderCommand.php', 97, 108) =]] diff --git a/docs/commerce/payment/payment.md b/docs/commerce/payment/payment.md index 269ae27d96..4ea3b52057 100644 --- a/docs/commerce/payment/payment.md +++ b/docs/commerce/payment/payment.md @@ -1,12 +1,12 @@ --- -description: The payment component covers defining and managing payment methods as well as managing payments and their lifecycle. +description: The payment component covers defining and managing payment methods, together with managing payments and their lifecycle. edition: commerce --- # Payment With the Payment component users can define and manage payment methods, create and manage payments, search for payment methods and payments, and filter payment search results. -Depending on their role, users can also enable or disable payment methods, modify payment information, as well as cancel payments. +Depending on their role, users can also enable or disable payment methods, modify payment information, and cancel payments. Available payment method types: diff --git a/docs/commerce/shipping_management/shipping_management.md b/docs/commerce/shipping_management/shipping_management.md index 611efe3c54..07e785ab38 100644 --- a/docs/commerce/shipping_management/shipping_management.md +++ b/docs/commerce/shipping_management/shipping_management.md @@ -1,11 +1,11 @@ --- -description: The shipping component covers defining and managing shipping methods as well as managing shipments and their lifecycle. +description: The shipping component covers defining and managing shipping methods, together with managing shipments and their lifecycle. edition: commerce --- # Shipping -The shipping component enables users to define and manage shipping methods of different types, as well as create and manage shipments, search for shipments and filter search results. +The shipping component enables users to define and manage shipping methods of different types, create and manage shipments, search for shipments, and filter search results. Depending on their role, users can also enable or disable shipping methods, change status of shipments, and cancel shipments. !!! note "Shipping method types" diff --git a/docs/content_management/content_api/browsing_content.md b/docs/content_management/content_api/browsing_content.md index d3ce0981a3..8cdcadcf01 100644 --- a/docs/content_management/content_api/browsing_content.md +++ b/docs/content_management/content_api/browsing_content.md @@ -1,5 +1,5 @@ --- -description: Use PHP API to get content items and their information, as well as content Fields, Location, and others. +description: Use PHP API to get content items and their information, content Fields, Location, and others. --- # Browsing and viewing content @@ -21,8 +21,7 @@ The service should be [injected into the constructor of your command or controll ### ContentInfo Basic content metadata is available through [`ContentInfo`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html) objects and their properties. -This value object provides primitive fields, such as `contentTypeId`, `publishedDate`, or `mainLocationId`, -as well as methods for retrieving selected properties. +This value object provides primitive fields, such as `contentTypeId`, `publishedDate`, or `mainLocationId`, and methods for retrieving selected properties. You can also use it to request other Content-related value objects from various services: diff --git a/docs/content_management/content_api/creating_content.md b/docs/content_management/content_api/creating_content.md index 403ce8978c..c8c381a5ad 100644 --- a/docs/content_management/content_api/creating_content.md +++ b/docs/content_management/content_api/creating_content.md @@ -45,8 +45,7 @@ the `ContentCreateStruct` is slightly more complex than in the previous example: [[= include_file('code_samples/api/public_php_api/src/Command/CreateImageCommand.php', 56, 69) =]] ``` -Value of the Image field type contains the path to the image file, as well as other basic information -based on the input file. +Value of the Image field type contains the path to the image file and other basic information based on the input file. ### Creating content with RichText diff --git a/docs/content_management/content_api/managing_content.md b/docs/content_management/content_api/managing_content.md index 28c96b97a3..4bb52490ba 100644 --- a/docs/content_management/content_api/managing_content.md +++ b/docs/content_management/content_api/managing_content.md @@ -1,5 +1,5 @@ --- -description: PHP API enables managing content Locations, content types, as well as content in Trash and Calendar events. +description: PHP API enables managing content Locations, content types, content in Trash, and Calendar events. --- # Managing content @@ -213,7 +213,7 @@ You can process the events in a collection using the `find(Closure $predicate)`, You can perform a calendar action (e.g. reschedule or unschedule calendar events) using the `CalendarServiceInterface::executeAction()` method. You must pass an `Ibexa\Contracts\Calendar\EventAction\EventActionContext` instance as argument. -`EventActionContext` defines events on which the action is performed, as well as action-specific parameters e.g. a new date: +`EventActionContext` defines events on which the action is performed, and action-specific parameters, for example, a new date: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CalendarCommand.php', 59, 61) =]] diff --git a/docs/content_management/content_management_api/bookmark_api.md b/docs/content_management/content_management_api/bookmark_api.md index 7411ed8d09..f85d0e0cb2 100644 --- a/docs/content_management/content_management_api/bookmark_api.md +++ b/docs/content_management/content_management_api/bookmark_api.md @@ -1,5 +1,5 @@ --- -description: You can use the PHP API to view the bookmark list, as well as add and remove content from it. +description: You can use the PHP API to view the bookmark list, and add or remove content from it. --- # Bookmark API diff --git a/docs/content_management/content_management_api/section_api.md b/docs/content_management/content_management_api/section_api.md index 317a1c6b4b..cf1baca9e2 100644 --- a/docs/content_management/content_management_api/section_api.md +++ b/docs/content_management/content_management_api/section_api.md @@ -1,5 +1,5 @@ --- -description: PHP API enables you to create Sections, assign content to them as well as get various information about the Section. +description: PHP API enables you to create Sections, assign content to them, and get various information about the Section. --- # Section API diff --git a/docs/content_management/content_management_guide.md b/docs/content_management/content_management_guide.md index efa1dc185a..81944eb58f 100644 --- a/docs/content_management/content_management_guide.md +++ b/docs/content_management/content_management_guide.md @@ -79,9 +79,9 @@ For a complete list of available field types, see [field type reference](field_t Once you use a field type to design and build a content type definition, and define its settings, it becomes a Field. Fields can be as simple as Name, based on a Text line field type, or as complex as Page, -based on a Landing Page field type, with multiple options to set and choose from: +based on a landing page field type, with multiple options to set and choose from: -![Landing Page Field settings](img/fields.png) +![Landing page field settings](img/fields.png) ### Content types @@ -150,14 +150,14 @@ Editors can compare different translations of the same content items with the Co #### Relations -A [relation](content_relations.md) can exist between any two content items in the content tree. -For example, blog posts featured in the website's main page are in a relation with the page that they're embedded in. +A [relation](content_relations.md) can exist between any two content items in the content tree. +For example, blog posts featured in the website's main page are in a relation with the page that they're embedded in. Or, instead of direct attachments, an article can use images that are separate content items outside the article and are referenced through a relation. ## Content arrangement -In [[= product_name =]], content items can be moved and copied between branches of the content tree. -These operations, like in your computer’s file system, can apply both to individual content items as well as folders or groups. +In [[= product_name =]], content items can be moved and copied between branches of the content tree. +These operations, like in your computer’s file system, can apply both to individual content items and folders or groups. ![Content organization operations](img/content_arrangement.png) diff --git a/docs/content_management/content_model.md b/docs/content_management/content_model.md index a56a99b03b..429b5ac338 100644 --- a/docs/content_management/content_model.md +++ b/docs/content_management/content_model.md @@ -52,10 +52,10 @@ It's set by the system the first time the content item is published. The ownership of an item cannot be modified and doesn't change even if the owner is removed from the system. **`modificationDate`** - date and time when the content item was last modified. -This is set by the system and cannot be modified manually, but changes every time the item is published again. +It's set by the system and cannot be modified manually, but changes every time the item is published again. **`publishedDate`** - date and time when the content item was published for the first time. -This is set by the system and cannot be modified. +It's set by the system and cannot be modified. **`alwaysAvailable`** - indicates if the content item is shown in the main language when it's not present in another requested language. It's [set per content type](content_availability.md). @@ -94,17 +94,16 @@ Validation depends on the settings of a particular field type. It cannot be turn Aside from the field type, the field definition in a content type provides the following information: -**Name** – a user-friendly name that describes the field. This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces and special characters; the maximum length is 255 characters. If no name is provided, a unique one is automatically generated. +**Name** – a user-friendly name that describes the field. This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces, and special characters (the maximum length is 255 characters). If no name is provided, a unique one is automatically generated. -**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It can only contain lowercase letters, digits and underscores; the maximum length is 50 characters. This identifier is also used in name patterns for the content type. +**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It can only contain lowercase letters, digits and underscores (the maximum length is 50 characters). This identifier is also used in name patterns for the content type. **Description** – a detailed description of the field. **Required** – a flag which indicates if the field is required for the system to accept the content item. By default, if a field is flagged as Required, a user isn't able to publish a content item without filling in this field. !!! note - You can use the `ContentService::validate()` method to decide whether the required fields or whole content items are checked for - completeness at other stages of the editing process. + You can use the `ContentService::validate()` method to decide whether the required fields or whole content items are checked for completeness at other stages of the editing process. The Required flag is in no way related to field validation. A field's value is validated whether the field is set as required or not. @@ -112,9 +111,9 @@ Aside from the field type, the field definition in a content type provides the f The Searchable flag isn't available for some fields, because some field types do not allow searching through their values. -**[Translatable](languages.md)** – a flag which indicates if the value of the field can be translated. This is independent of the field type, which means that even fields such as "Float" or "Image" can be set as translatable. +**[Translatable](languages.md)** – a flag which indicates if the value of the field can be translated. It's independent of the field type, which means that even fields such as "Float" or "Image" can be set as translatable. -Depending on the field type, there may also be other, specific information to fill in. For example, the "Country" field type allows you to select the default country, as well as to allow selecting multiple countries at the same time. +Depending on the field type, there may also be other, specific information to fill in. For example, the "Country" field type allows you to select the default country, and to allow selecting multiple countries at the same time. ![Diagram of content model](content_model_diagram.png) diff --git a/docs/content_management/data_migration/data_migration.md b/docs/content_management/data_migration/data_migration.md index 8c5441b88d..816194eede 100644 --- a/docs/content_management/data_migration/data_migration.md +++ b/docs/content_management/data_migration/data_migration.md @@ -9,8 +9,7 @@ Data migration allows exporting and importing selected data from an [[= product_ [*Exporting*](exporting_data.md) data consists in saving selected repository information in YAML format. [*Importing*](importing_data.md) reads migration YAML files and creates or modifies repository content based on them. -You can migrate your repository data, that is content items, as well as content types, languages, Object states, Sections, and so on, -between installations. +Between installation, you can migrate your repository data, for example, content items, content types, languages, object states, or sections. You can use migrations in projects that require the same data to be present across multiple instances. They can be useful for project templates. Migrations are able to store shared data, so they can be applied for each new project you start, diff --git a/docs/content_management/data_migration/exporting_data.md b/docs/content_management/data_migration/exporting_data.md index 2e193c6315..d2969cac0e 100644 --- a/docs/content_management/data_migration/exporting_data.md +++ b/docs/content_management/data_migration/exporting_data.md @@ -71,12 +71,12 @@ For example, you could: - Remove `references` if you don't intend to store IDs for future use (see [migration references](managing_migrations.md#references)) - Remove `publicationDate`, `modificationDate`, `locationRemoteId`, - as those are generated if not passed (just like in PHP API) + as those are generated if not passed (like in PHP API) - Add [`actions`](data_migration_actions.md) - Add fields for other languages present in the system. Similarly, you can create update and delete operations. -they're particularly useful combined with `match-property`. +They're particularly functional combined with `match-property`. This option is automatically added as part of `match` expression in the update/delete migration: ``` bash @@ -128,7 +128,7 @@ php bin/console ibexa:migrations:generate --type=content_type --mode=update --ma ``` -Note that you should test your migrations. See [Importing data](importing_data.md). +You should test your migrations. See [Importing data](importing_data.md). !!! tip diff --git a/docs/content_management/data_migration/importing_data.md b/docs/content_management/data_migration/importing_data.md index a2316b1a09..8dfe1c67ee 100644 --- a/docs/content_management/data_migration/importing_data.md +++ b/docs/content_management/data_migration/importing_data.md @@ -278,7 +278,7 @@ enabling swift file migration regardless of storage (local, DFS). The following example shows how to create a role. A role requires the `identifier` metadata key. -For each policy assigned to the role, you select the module and function, with optional Limitations. +For each policy assigned to the role, you select the module and function, with optional limitations. The following example shows the creation of a `Contributor` role: diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index 0f2c65c352..6b2b20a569 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -140,7 +140,7 @@ Image Fields within REST are exposed by the `application/vnd.ibexa.api.Content` ``` -Children of the `fieldValue` node list the general properties of the Field's original image (`fileSize`, `fileName`, `inputUri`, etc.), as well as variations. For each variation, a URI is provided. Requested through REST, this resource generates the variation if it doesn't exist yet, and list the variation details: +Children of the `fieldValue` node list the general properties of the Field's original image (`fileSize`, `fileName`, `inputUri`, etc.), and its variations. For each variation, a URI is provided. Requested through REST, this resource generates the variation if it doesn't exist yet, and list the variation details: ``` xml diff --git a/docs/content_management/field_types/type_and_value.md b/docs/content_management/field_types/type_and_value.md index 760fde1629..cd2f40ee22 100644 --- a/docs/content_management/field_types/type_and_value.md +++ b/docs/content_management/field_types/type_and_value.md @@ -47,7 +47,7 @@ The type is asked to validate the settings (provided by the user) before the pub As in `validateFieldSettings()`, this method verifies that the given validator configuration complies to the schema provided by `getValidatorConfigurationSchema()`. -It's important to note that the schema definitions of the field type can be both of arbitrary and serializable format. It's highly recommended to use a simple hash structure. +It's important to know that the schema definitions of the field type can be both of arbitrary and serializable format. It's highly recommended to use a simple hash structure. !!! note @@ -91,7 +91,7 @@ It's based on the field type settings and validator configuration and stored in ### Serialization -When [REST API](rest_api_usage.md) is used, conversion needs to be done for field type values, settings and validator configurations. These are converted to and from a simple hash format that can be encoded in REST payload. As conversion needs to be done both when transmitting and receiving data through REST, field type implements the following pairs of methods: +When [REST API](rest_api_usage.md) is used, conversion needs to be done for field type values, settings, and validator configurations. These are converted to and from a simple hash format that can be encoded in REST payload. As conversion needs to be done both when transmitting and receiving data through REST, field type implements the following pairs of methods: |Method|Description| |------|-----------| @@ -107,7 +107,7 @@ When [REST API](rest_api_usage.md) is used, conversion needs to be done for fiel ## Registration The field type must be registered in `config/services.yml`: - + ``` yaml services: Ibexa\FieldTypeMatrix\FieldType\Type: @@ -126,8 +126,7 @@ If you need to inject other services into your Type class, skip using the `paren Like most API components, field types use the [Symfony service tag mechanism]([[= symfony_doc =]]/service_container/tags.html). A service can be assigned one or several tags, with specific parameters. -When the [service container](php_api.md#service-container) is compiled into a PHP file, -tags are read by `CompilerPass` implementations that add extra handling for tagged services. +When the [service container](php_api.md#service-container) is compiled into a PHP file, tags are read by `CompilerPass` implementations that add extra handling for tagged services. Each service tagged as `ibexa.field_type` is added to a [registry](https://martinfowler.com/eaaCatalog/registry.html) using the `alias` key as its unique `fieldTypeIdentifier` e.g. `ezstring`. Each field type must also inherit from the abstract `ibexa.field_type` service. This ensures that the initialization steps shared by all field types are executed. @@ -168,8 +167,7 @@ The settings are mapped into Symfony forms via the [FormMapper](form_and_templat !!! note - You can store field type settings internally, or, when the schema becomes - too complex, move them to [external storage](field_type_storage.md#storing-field-type-settings-externally). + You can store field type settings internally, or, when the schema becomes too complex, move them to [external storage](field_type_storage.md#storing-field-type-settings-externally). ## Extensibility points diff --git a/docs/content_management/images/fastly_io.md b/docs/content_management/images/fastly_io.md index 6d9d518cf2..4ec1bcf606 100644 --- a/docs/content_management/images/fastly_io.md +++ b/docs/content_management/images/fastly_io.md @@ -76,7 +76,7 @@ that they should reflect variations in your original setup. The built-in image optimizer serves as backup to Fastly IO in case of misconfiguration, so it needs to be able to serve the same image variations. -Fastly IO image filters aren't compatible with our built-in filters, +Fastly IO image filters aren't compatible with [[= product_name_base =]] built-in filters, so you aren't able to reflect your original filters accurately with Fastly. The script below helps you find replacement filters within Fastly configuration for the basic filters. For more optimization options on Fastly side, see [Fastly IO reference](https://developer.fastly.com/reference/io/). diff --git a/docs/content_management/images/images.md b/docs/content_management/images/images.md index 7039e57368..4ccbc325fa 100644 --- a/docs/content_management/images/images.md +++ b/docs/content_management/images/images.md @@ -7,41 +7,33 @@ description: Manage image assets by using DAM systems, configuring image variati Images are an integral part of any website. They can serve as decoration and convey information. -In [[= product_name =]], you can reuse them, normalize their file names, generate -different size variations, resize images programmatically, or even define -placeholders for missing ones. +In [[= product_name =]], you can reuse them, normalize their file names, generate different size variations, resize images programmatically, or even define placeholders for missing ones. ## Images from DAM systems -If your installation is connected to a DAM system, you can use images directly -from a DAM system in your content. +If your installation is connected to a DAM system, you can use images directly from a DAM system in your content. -Specific [DAM configuration](add_image_asset_from_dam.md#dam-configuration) depends on -the system that the installation uses. +Specific [DAM configuration](add_image_asset_from_dam.md#dam-configuration) depends on the system that the installation uses. ## Reuse images -You can store images in the media library as independent content items of -a generic Image [content type](content_types.md) to reuse them across the system. +You can store images in the media library as independent content items of a generic Image [content type](content_types.md) to reuse them across the system. You do this by uploading images to an [ImageAsset](imageassetfield.md) field type. -For an ImageAsset field to be reused, you must publish it. -Only then is notification triggered, which states that an image has been published -under the Location and can now be reused. -After you establish a media library, you can create [Relations](content_relations.md) between the -image content item and the main content item that uses it. +For an ImageAsset field to be reused, you must publish it. +Only then is notification triggered, which states that an image has been published under the location and can now be reused. +After you establish a media library, you can create [Relations](content_relations.md) between the image content item and the main content item that uses it. ## Normalizing image file names -If you use image files with unprintable UTF-8 characters in file names, you may -come across a problem with images not displaying. +If you use image files with unprintable UTF-8 characters in file names, you may come across a problem with images not displaying. Run the following command to normalize image file names: ``` bash php bin/console ibexa:images:normalize-paths ``` -Next, clear the cache: +Next, clear the cache: ```bash php bin/console cache:clear @@ -55,44 +47,32 @@ php bin/console liip:imagine:cache:remove ## Configuring image variations -With [image variations](image_variations.md) (image aliases) you can define and use different versions -of the same image. -You generate variations based on [filters](image_variations.md#available-variation-filters) that modify aspects such as size -and proportions, quality or effects. - -Image variations are generated with [LiipImagineBundle](https://github.com/liip/LiipImagineBundle), by using the underlying -[Imagine library](https://imagine.readthedocs.io/en/latest/).  -The LiipImagineBundle bundle supports GD (default), Imagick or Gmagick PHP -extensions, and enables you to define flexible filters in PHP.  -Image files are stored by using the `IOService,` and are completely independent -from the Image field type. +With [image variations](image_variations.md) (image aliases) you can define and use different versions of the same image. +You generate variations based on [filters](image_variations.md#available-variation-filters) that modify aspects such as size and proportions, quality or effects. + +Image variations are generated with [LiipImagineBundle](https://github.com/liip/LiipImagineBundle), by using the underlying [Imagine library](https://imagine.readthedocs.io/en/latest/).  +The LiipImagineBundle bundle supports GD (default), Imagick or Gmagick PHP extensions, and enables you to define flexible filters in PHP.  +Image files are stored by using the `IOService,` and are completely independent from the Image field type. they're generated only once and cleared on demand, for example, on content removal). -LiipImagineBundle only works on image blobs, so no command line tool is needed. +LiipImagineBundle only works on image blobs, so no command line tool is needed. For more information, see the [bundle's documentation](https://symfony.com/bundles/LiipImagineBundle/current/configuration.html). !!! caution "Code injection in image EXIF" - EXIF metadata of an image may contain for example, HTML, JavaScript, - or PHP code.  - [[= product_name =]] is itself does not parse EXIF metadata, but third-party - bundles must be secured against this eventuality. - Images must be treated like any other user-submitted data - make sure that - metadata is properly escaped before use. + EXIF metadata of an image may contain for example, HTML, JavaScript, or PHP code.  + [[= product_name =]] is itself does not parse EXIF metadata, but third-party bundles must be secured against this eventuality. + Images must be treated like any other user-submitted data - make sure that metadata is properly escaped before use. ### Image URL resolution -You can use LiipImagine's `liip:imagine:cache:resolve` command to resolve the path -to image variations that are generated from the original image, with one or more -paths as arguments. -Paths to repository images must be relative to the `var//storage/images` -directory, for example: `7/4/2/0/247-1-eng-GB/test.jpg`. +You can use LiipImagine's `liip:imagine:cache:resolve` command to resolve the path to image variations that are generated from the original image, with one or more paths as arguments. +Paths to repository images must be relative to the `var//storage/images` directory, for example: `7/4/2/0/247-1-eng-GB/test.jpg`. For more information, see [LiipImagineBundle documentation](https://symfony.com/bundles/LiipImagineBundle/current/basic-usage.html#resolve-with-the-console). ## Resizing images -You can resize all original images of a chosen content type with the following -command. +You can resize all original images of a chosen content type with the following command. ``` bash php bin/console ibexa:images:resize-original -f @@ -112,11 +92,9 @@ php bin/console ibexa:images:resize-original image photo -f small_image You can also pass two additional parameters: -- `iteration-count` is the number of images to be recreated in a single iteration, - to reduce memory use. +- `iteration-count` is the number of images to be recreated in a single iteration, to reduce memory use. The default value is `25`. -- `user` is the identifier of a User with proper permission who performs - the operation (`read`, `versionread`, `edit` and `publish`). +- `user` is the identifier of a User with proper permission who performs the operation (`read`, `versionread`, `edit` and `publish`). The default value is `admin`. !!! caution @@ -125,15 +103,10 @@ You can also pass two additional parameters: ## Generating placeholder images -With a placeholder generator you can download or generate placeholder images for -any missing image. -It proves useful when you're working on an existing database and are unable to -download uploaded images to your local development environment, due to, for -example, a large size of files. +With a placeholder generator you can download or generate placeholder images for any missing image. +It proves useful when you're working on an existing database and are unable to download uploaded images to your local development environment, due to, for example, a large size of files. -If the original image cannot be resolved, the `PlaceholderAliasGenerator::getVariation` -method generates a placeholder by delegating it to the implementation of the -`PlaceholderProvider` interface, and saves it under the original path. +If the original image cannot be resolved, the `PlaceholderAliasGenerator::getVariation` method generates a placeholder by delegating it to the implementation of the `PlaceholderProvider` interface, and saves it under the original path. In [[= product_name =]], there are two implementations of the `PlaceholderProvider` interface: @@ -146,8 +119,7 @@ In [[= product_name =]], there are two implementations of the `PlaceholderProvid ### GenericProvider -The [`GenericProvider`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider.php) package generates placeholders -with basic information about the original image (see [example 1](#configuration-examples)). +The [`GenericProvider`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider.php) package generates placeholders with basic information about the original image (see [example 1](#configuration-examples)). ![Placeholder image GenericProvider](placeholder_info.jpg "Example of a generic placeholder image") @@ -164,8 +136,7 @@ with basic information about the original image (see [example 1](#configuration- ### RemoteProvider -With the [`RemoteProvider`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider/RemoteProvider.php) you can download -placeholders from: +With the [`RemoteProvider`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider/RemoteProvider.php) you can download placeholders from: - remote sources, for example, (see [example 2](#configuration-examples)) - live version of a site (see [example 3](#configuration-examples)) @@ -179,9 +150,8 @@ placeholders from: ### Semantic configuration -Placeholder generation can be configured for each [`binary_handler`](file_management.md#handling-binary-files) under the -`ibexa.image_placeholder` [configuration key](configuration.md#configuration-files): - +Placeholder generation can be configured for each [`binary_handler`](file_management.md#handling-binary-files) under the `ibexa.image_placeholder` [configuration key](configuration.md#configuration-files): + ```yaml ibexa: # ... @@ -191,8 +161,7 @@ ibexa: options: ``` -If there is no configuration assigned to the `binary_handler`, the placeholder -generation is disabled. +If there is no configuration assigned to the `binary_handler`, the placeholder generation is disabled. ##### Configuration examples: @@ -216,20 +185,15 @@ generation is disabled. ## Support for SVG images -You cannot store SVG images in [[= product_name =]] by using the Image or -ImageAsset field type. -However, you can work things around by relying on the File field type and implementing -a custom extension that lets you display and download files in your templates. +You cannot store SVG images in [[= product_name =]] by using the Image or ImageAsset field type. +However, you can work things around by relying on the File field type and implementing a custom extension that lets you display and download files in your templates. !!! caution - SVG images may contain JavaScript, so they may introduce XSS or other security - vulnerabilities. - Make sure end users aren't allowed to upload SVG images, and be restrictive - about which editors are allowed to do so. + SVG images may contain JavaScript, so they may introduce XSS or other security vulnerabilities. + Make sure end users aren't allowed to upload SVG images, and be restrictive about which editors are allowed to do so. -First, enable adding SVG files to content by removing them from the blacklist -of allowed MIME types. +First, enable adding SVG files to content by removing them from the blacklist of allowed MIME types. To do it, overwrite `ibexa.site_access.config.default.io.file_storage.file_type_blacklist` defined in `Core/Resources/config/default_settings.yml` so that `svg` is removed from the blacklist. You can do it per SiteAccess or SiteAccess group by using [SiteAccess-aware configuration](siteaccess_aware_configuration.md). @@ -267,9 +231,7 @@ Now you can load SVG files in your templates by using generated links and a newl JPEG images are optimized using the ImageMagic library, which is available out of the box. -If you use other formats, such a PNG, SVG, GIF or WEBP, and you use the Image Editor, -to prevent images increasing in size when you modify them in the editor, -you need to install additional image handling libraries. +If you use other formats, such a PNG, SVG, GIF, or WEBP, and you use the Image Editor, to prevent images increasing in size when you modify them in the editor, you need to install additional image handling libraries. |Image format|Library| |---|---| @@ -287,11 +249,9 @@ sudo apt-get install optipng ## Embedding images in Rich Text -The [RichText](richtextfield.md) field allows you to embed other -content items within the field. +The [RichText](richtextfield.md) field allows you to embed other content items within the field. -Content items that are identified as images are rendered in the Rich Text field -by using a dedicated template. +Content items that are identified as images are rendered in the Rich Text field by using a dedicated template. You can determine content types that are treated as images and rendered. You do this by overriding the `ibexa.content_view.image_embed_content_types_identifiers` parameter, for example: diff --git a/docs/content_management/rich_text/online_editor_guide.md b/docs/content_management/rich_text/online_editor_guide.md index 64a343ade0..b4f4d76f4e 100644 --- a/docs/content_management/rich_text/online_editor_guide.md +++ b/docs/content_management/rich_text/online_editor_guide.md @@ -7,7 +7,7 @@ description: Learn how to use the Online Editor, a tool that allows you to edit ## What is Online Editor Online Editor is the interface for editing RichText Fields in any content item in [[= product_name =]]. -It offers standard editing capabilities as well as extensibility points to customize the editing experience and the available elements. +It offers standard editing capabilities and extensibility points to customize the editing experience and the available elements. Online Editor is based on [CKEditor 5](https://ckeditor.com/ckeditor-5/). @@ -25,9 +25,8 @@ To start using it, create any content item with a RichText Field ### Rich Text editor -Online Editor covers all fundamental formatting options for rich text, -such as headings, lists, tables, inline text formatting, anchors and links. -It also allows embedding other content from the repository, as well as from Facebook, Twitter or YouTube. +Online Editor covers all fundamental formatting options for rich text, such as headings, lists, tables, inline text formatting, anchors, and links. +It also allows embedding other content from the repository, but also from Facebook, Twitter, or YouTube. #### Links @@ -47,9 +46,12 @@ For more information, see [Distraction free mode]([[= user_doc =]]/content_manag Custom tags are customizable RichText elements for which you can specify attributes and render them with custom templates. -Custom tags can be created by means of specifying two things only: -YAML configuration and relevant Twig templates. -The YAML configuration defines a custom tag’s attributes and the template used to render it, as well as where in the toolbar the tag is available. +Custom tags can be created by means of specifying two things only: + +- YAML configuration +- relevant Twig templates + +The YAML configuration defines a custom tag’s attributes, the template used to render it, and where in the toolbar the tag is available. See [Extend Online Editor](extend_online_editor.md#configure-custom-tags) for a full example. @@ -95,9 +97,10 @@ The range of available text elements can be extended by offering custom elements Custom formatting options can be offered either as custom CSS classes that editors can add to specific elements, or as custom styles which can have their own templates. -More extensive customization is available via custom tags: -completely custom RichText elements that you can fully configure, -as well as custom CKEditor 5 plugins. +More extensive customization is available via custom tags: + +- completely custom RichText elements that you can fully configure +- custom CKEditor 5 plugins ## Use cases diff --git a/docs/content_management/url_management/url_management.md b/docs/content_management/url_management/url_management.md index 8c815a71b1..d55a523a8b 100644 --- a/docs/content_management/url_management/url_management.md +++ b/docs/content_management/url_management/url_management.md @@ -71,7 +71,7 @@ ibexa: batch_size: 64 https: enabled: true - ignore_certificate: false + ignore_certificate: false mailto: enabled: false ``` @@ -137,20 +137,17 @@ The `scheme` attribute is mandatory and has to correspond to the name of the pro ## URL aliases You can define URL aliases for individual content items, for example, when you reorganize the content, and want to provide users with continuity. -For each URL alias definition the history of changes is preserved, so that users who have bookmarked the URL addresses of content items can still find he information they desire. +For each URL alias definition the history of changes is preserved, so that users who have bookmarked the URL addresses of content items can still find the information they desire. !!! note - Make sure that you correctly define languages used by the site in the configuration - (under the `ibexa.system..languages` key). - Otherwise, redirections for the renamed Content with translations in multiple - languages may fail to work properly. + Make sure that you correctly define languages used by the site in the configuration (under the `ibexa.system..languages` key). + Otherwise, redirections for the renamed Content with translations in multiple languages may fail to work properly. !!! caution "Legacy storage engine limitation" - The [Legacy storage engine](field_type_storage.md#legacy-storage-engine) does not archive URL aliases, which initially - had the same name in multiple languages. - For more information, see [the Jira ticket](https://issues.ibexa.co/browse/EZP-31818). + The [Legacy storage engine](field_type_storage.md#legacy-storage-engine) does not archive URL aliases, which initially had the same name in multiple languages. + For more information, see [the Jira ticket](https://issues.ibexa.co/browse/EZP-31818). URL aliases aren't SiteAccess-aware. When creating an alias, you can select a SiteAccess to base it on. If the SiteAccess root path (configured in `content.tree_root.location_id`) is different than the default, diff --git a/docs/customer_management/cp_page_builder.md b/docs/customer_management/cp_page_builder.md index e280bb0261..9e92a6550e 100644 --- a/docs/customer_management/cp_page_builder.md +++ b/docs/customer_management/cp_page_builder.md @@ -69,7 +69,7 @@ ibexa: - custom_portal ``` -Now, you can go to your Customer Portal Landing Page and edit it in Page Builder. +Now, you can go to your Customer Portal landing page and edit it in Page Builder. ![Edit Customer Portal in Page Builder](img/cp_edit_in_page_builder.png) diff --git a/docs/ibexa_engage/create_campaign.md b/docs/ibexa_engage/create_campaign.md index 5ac8930805..e76f92e8db 100644 --- a/docs/ibexa_engage/create_campaign.md +++ b/docs/ibexa_engage/create_campaign.md @@ -22,7 +22,7 @@ For more information about publication channels, see [Publication channel]([[= u ## Use Campaign block in Page Builder -You can add [Campaign block]([[= user_doc =]]/content_management/block_reference/#campaign-block) in Page Builder to display campaign on the Landing Page. +You can add [Campaign block]([[= user_doc =]]/content_management/block_reference/#campaign-block) in Page Builder to display campaign on the landing page. To select campaign, go to **Properties** tab. From the **Campaign** drop-down, choose campaign. This list includes all campaigns available on user's Qualifio account which are active or scheduled to launch in the future. diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md index 22dd6df4d2..89f4fbed80 100644 --- a/docs/ibexa_products/ibexa_headless.md +++ b/docs/ibexa_products/ibexa_headless.md @@ -10,7 +10,7 @@ description: Get to know Ibexa Headless - an edition that focuses on content man 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. +Multilingual, multichannel, extensible, [[= product_name_headless =]] is an advanced Content Management Framework (CMF), a Product Information Management (PIM) platform, and 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. ![Ibexa Headless](ibexa_headless.png) diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index c740b9fcdd..e1b32f1328 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -27,7 +27,7 @@ and updated in the background when someone requests them. Current content tags (and when the system purges on them): - Content: `c` - Purged on all smaller or larger changes to content (including its metadata, fields and Locations). -- Content Version: `cv` - Purged when any version of Content is changed (for example, a draft is created or removed). +- Content version: `cv` - Purged when any version of Content is changed (for example, a draft is created or removed). - Content type: `ct` - Used when the content type changes, affecting content of its type. - Location: `l` - Used for clearing all cache relevant for a given Location. - Parent Location: `pl<[parent-]location-id>` - Used for clearing all children of a Location (`pl`), or all siblings (`pl`). @@ -60,9 +60,8 @@ Examples: ### Troubleshooting - Cache header too long errors -In case of complex content, for example, Pages with many blocks, or RichText with a lot of embeds/links, -you can encounter problems with too long cache header on responses. -It happens because necessary cache entries may not be tagged properly. +In case of complex content, for example, Pages with many blocks, or RichText with a lot of embeds/links, you can encounter problems with too long cache header on responses. +It happens because necessary cache entries may not be tagged properly. You may also see `502 Headers too long` errors, and webserver refusing to serve the page. You can solve this issue in one of the following ways: @@ -89,15 +88,14 @@ Apache has a [hard](https://github.com/apache/httpd/blob/5f32ea94af5f1e7ea68d6fc #### B. Limit tags header output by system -1\. For inline rendering just displaying the content name, image attribute, and/or link, it would be enough to: +1\. For inline rendering displaying the content name, image attribute, and/or link, it would be enough to: - Look into how many inline (non ESI) render calls for content rendering you're doing, and see if you can organize it differently. - Consider inlining the views not used elsewhere in the given template and [tagging the response in Twig](#response-tagging-in-templates) with "relation" tags. - (Optional) You can set reduced cache TTL for the given view, to reduce the risk of stale cache on subtree operations affecting the inlined content. -2\. You can opt in to set a max length parameter (in bytes) and corresponding ttl (in seconds) -for cases when the limit is reached. The system logs a warning where the limit is reached, and when needed, you can optimize -these cases as described above. +2\. You can opt in to set a max length parameter (in bytes) and corresponding ttl (in seconds) for cases when the limit is reached. +The system logs a warning where the limit is reached, and when needed, you can optimize these cases as described above. ```yaml parameters: @@ -122,19 +120,19 @@ If the given content has several Locations, you can see several `l` !!! note "How response tagging for ContentView is done internally" In `ibexa/http-cache` there is a dedicated response listener `HttpCacheResponseSubscriber` that checks if: - + - the response has attribute `view` - the view implements `Ibexa\Core\MVC\Symfony\View\CachableView` - cache isn't disabled on the individual view If that checks out, the response is adapted with the following: - + - `ResponseCacheConfigurator` applies SiteAccess settings for enabled/disabled cache and default TTL. - `DispatcherTagger` dispatches the built-in ResponseTaggers which generate the tags as described above. ### ResponseConfigurator -A `ReponseCacheConfigurator` configures an HTTP Response object, makes the response public, adds tags and sets the shared max age. +A `ReponseCacheConfigurator` configures an HTTP Response object, makes the response public, adds tags, and sets the shared max age. It's provided to `ReponseTaggers` that use it to add the tags to the response. The `ConfigurableResponseCacheConfigurator` (`Ibexa\HttpCache\ResponseConfigurator\ConfigurableResponseCacheConfigurator`) follows the `view_cache` configuration and only enables cache if it's enabled in the configuration. @@ -288,9 +286,7 @@ In the event when a new version of `Child` is published, the following keys are - `l20`, because cache for parent of `[Child]` should be purged - `pl20`, because cache for siblings of `[Child]` should be purged -In summary, HTTP Cache for any location representing `[Child]`, any Content that relates to the Content `[Child]`, the -location for `[Child]`, any children of `[Child]`, any Location that relates to the Location `[Child]`, location for -`[Parent1]`, any children on `[Parent1]`. +In summary, HTTP Cache for any location representing `[Child]`, any Content that relates to the Content `[Child]`, the location for `[Child]`, any children of `[Child]`, any Location that relates to the Location `[Child]`, location for `[Parent1]`, any children on `[Parent1]`. Effectively, in this example HTTP cache for `[Parent1]` and `[Child]` is cleared. @@ -370,13 +366,12 @@ cases does the job. But if you need to change the varnish configuration to make that .vcl code for Varnish V6.x doesn't likely work as-is on Fastly. This section describes to how to debug problems related to HTTP cache. - In order to that, you must be able to look both at - responses and headers [[= product_name =]] sends to HTTP cache, and not so much at responses and headers + You must be able to look both at responses and headers [[= product_name =]] sends to HTTP cache, and not so much at responses and headers the HTTP cache sends to the client (web browser). It means you must be able to send requests to your origin (web server) that do not go through Varnish or Fastly. - If you run Nginx and Varnish on premise, you should know what host and port number both Varnish and Nginx runs on. If you - perform tests on Fastly enabled environment on [[= product_name_cloud =]] provided by Platform.sh, you need to use the Platform.sh - Dashboard to obtain the endpoint for Nginx. + If you run Nginx and Varnish on premise, you should know what host and port number both Varnish and Nginx runs on. + If you perform tests on Fastly enabled environment on [[= product_name_cloud =]] provided by Platform.sh, you need to use the Platform.sh + dashboard to obtain the endpoint for Nginx. The following example shows how to debug and check why Fastly does not cache the front page properly. If you run the command multiple times: @@ -418,10 +413,8 @@ You can also use the [Ibexa Cloud CLI](https://cli.ibexa.co/) (which has the sam #### Finding Nginx endpoint on dedicated cloud -If you have a dedicated 3-node cluster on Platform.sh, the procedure for getting the endpoint to environments that are -located on that cluster (`production` and sometimes also `staging`) is slightly different. -In the **URLs** drop-down in the Platform.sh dashboard, find the route that has the format -`somecontent.[clusterid].ent.platform.sh/`, for example, `myenvironment.abcdfg2323.ent.platform.sh/` +If you have a dedicated 3-node cluster on Platform.sh, the procedure for getting the endpoint to environments that are located on that cluster (`production` and sometimes also `staging`) is slightly different. +In the **URLs** drop-down in the Platform.sh dashboard, find the route that has the format `somecontent.[clusterid].ent.platform.sh/`, for example, `myenvironment.abcdfg2323.ent.platform.sh/` The endpoint in case has the format `c.[clusterid].ent.platform.sh`, for example, `c.asddfs2323.ent.platform.sh/` Next, use nslookup to find the IP: diff --git a/docs/infrastructure_and_maintenance/clustering/clustering.md b/docs/infrastructure_and_maintenance/clustering/clustering.md index 690ed7e5ec..a15134289f 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering.md @@ -13,9 +13,7 @@ The parts illustrate the different roles needed for a successful cluster setup. ![Server setup for clustering](server_setup.png) -The number of web servers, Memcached/Redis, Solr, Varnish, Database and NFS servers, -as well as whether some servers play several of these roles (typically running Memcached/Redis across the web server) -is up to you and your performance needs. +The number of web servers, Memcached/Redis, Solr, Varnish, Database, and NFS servers, but also whether some servers play several of these roles (typically running Memcached/Redis across the web server), is up to you and your performance needs. The minimal requirements are: diff --git a/docs/infrastructure_and_maintenance/environments.md b/docs/infrastructure_and_maintenance/environments.md index 16ef74f22e..7753ee0d8f 100644 --- a/docs/infrastructure_and_maintenance/environments.md +++ b/docs/infrastructure_and_maintenance/environments.md @@ -1,11 +1,11 @@ --- -description: In Ibexa DXP you can use environment provided by Symfony in virtual host configuration, as well as to create custom environments. +description: In Ibexa DXP you can use environment provided by Symfony in virtual host configuration, and to create custom environments. --- # Environments Environment configuration is provided by Symfony. [[= product_name =]] additionally enables you to specify environments in virtual host configuration. -You can configure several environments, such as production, development or staging. You can have different configuration sets for each of them. +You can configure several environments, such as production, development, or staging. You can have different configuration sets for each of them. !!! tip diff --git a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md index 9682427a07..b5ca18fd9e 100644 --- a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md +++ b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md @@ -4,8 +4,7 @@ description: See how you can resolve common issues and report a Customer Support # Support and maintenance FAQ -This page contains answers to most common questions and tips around support and maintenance, -as well as references to important parts of the documentation and tools useful for developers in their daily work. +This page contains answers to most common questions and tips around support and maintenance, references to important parts of the documentation, and tools for developers in their daily work. #### What information should I specify when creating a Customer Support ticket? diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index 80959fd60f..7654d8c5e9 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -39,7 +39,7 @@ To create and publish content, users must additionally have the following polici - `content/edit` - `content/publish` -This also lets the user copy and move content, as well as add new Locations to a content item (but not remove them). +This also lets the user copy and move content, and add new Locations to a content item (but not remove them). ## Move content diff --git a/docs/personalization/personalization_guide.md b/docs/personalization/personalization_guide.md index 49978e7000..30fed7bf76 100644 --- a/docs/personalization/personalization_guide.md +++ b/docs/personalization/personalization_guide.md @@ -91,8 +91,7 @@ Create websites with content targeted at your customers. Deliver your visitors r ### Reduce clutter and improve customer retention -Help users find content of their interest quicker, -use words to appeal to individual customers, as well as segments. +Help users find content of their interest quicker, use words to appeal to individual customers and segments. Enrich customer data by integrating [[= product_name_base =]] Personalization with other systems such as ERP, CRMs. Track user’s scenarios and develop strategies that match your strategies and improve engagement. ### Satisfy customer expectations diff --git a/docs/pim/add_remote_pim_support.md b/docs/pim/add_remote_pim_support.md index f9f9ae42f8..ef537b0273 100644 --- a/docs/pim/add_remote_pim_support.md +++ b/docs/pim/add_remote_pim_support.md @@ -47,7 +47,7 @@ ibexa: !!! note "Enabling the remote PIM support" By default, the `ibexa.repositories..product_catalog.engine.type` key is set to `local`, which informs [[= product_name =]] that the built-in PIM solution is used. - By changing this setting, as well as changing the `ibexa.repositories..product_catalog.engine` setting from `default` to your custom value, you inform [[= product_name =]] that you're using a remote PIM. + By changing this setting and the `ibexa.repositories..product_catalog.engine` setting from `default` to your custom value, you inform [[= product_name =]] that you're using a remote PIM. ## Install Remote PIM example package diff --git a/docs/pim/pim_guide.md b/docs/pim/pim_guide.md index 739b368988..53c5b574e6 100644 --- a/docs/pim/pim_guide.md +++ b/docs/pim/pim_guide.md @@ -6,9 +6,7 @@ description: The PIM product guide provides a full description of the features a ## What is PIM -PIM is a Product Information Management module that lets you create, configure and -manage products, their specifications, assets, variants and prices, -as well as group products into categories and catalogs. +PIM is a Product Information Management module that lets you create, configure and manage products, their specifications, assets, variants, and prices, but also group products into categories and catalogs. ## Availability diff --git a/docs/pim/products.md b/docs/pim/products.md index 16dc76952c..b5f7b40bd1 100644 --- a/docs/pim/products.md +++ b/docs/pim/products.md @@ -4,8 +4,7 @@ description: Products in the PIM are characterized by attributes describing thei # Products -Products are a special type of content that contains typical content Fields -as well as additional product information. +Products are a special type of content that contains typical content Fields and additional product information. Each product belongs to a product type (similar to how a content item belongs to a content type). diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index db7752f8ec..e617cfcca2 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -33,7 +33,7 @@ This has been made possible by initial legacy contribution from [@peterkeung](ht #### Collection block -New Collection block is available in the Landing Page editor. +New Collection block is available in the landing page editor. It enables you to manually select a set of content items to be displayed. ![Collection block options with three content items selected](collection_block.png) diff --git a/docs/release_notes/ez_platform_v1.7.0_lts.md b/docs/release_notes/ez_platform_v1.7.0_lts.md index 51b1895d8d..e1fc90c844 100644 --- a/docs/release_notes/ez_platform_v1.7.0_lts.md +++ b/docs/release_notes/ez_platform_v1.7.0_lts.md @@ -20,7 +20,10 @@ With the LTS release, the [new product naming](http://ez.no/Blog/eZ-Announces-Na ### eZ Platform (Open Source) -- **i18n! Internationalization of the eZ Platform** User Interface is now possible. The new system selects the language to use based on the browser settings of the end user. The system makes it possible to create translations for eZ Platform UI. Studio internationalization, as well as translations ready to use are shipped in further releases. Community members are more than welcome to contribute to the translation process. +- **i18n! Internationalization of the eZ Platform** User Interface is now possible. The new system selects the language to use based on the browser settings of the end user. +The system makes it possible to create translations for eZ Platform UI. +Studio internationalization and translations ready to use are shipped in further releases. +Community members are more than welcome to contribute to the translation process. ![](i18n.png) @@ -29,7 +32,7 @@ With the LTS release, the [new product naming](http://ez.no/Blog/eZ-Announces-Na ![](udwre.png) -- The Admin Panel now provides a way to get a very clean **digest view of content types** configured in the system, with the ability to clearly get access to properties and field definitions. +- The Admin Panel now provides a way to get a clean **digest view of content types** configured in the system, with the ability to clearly get access to properties and field definitions. ![](contenttypeviews.png) @@ -65,15 +68,17 @@ With the LTS release, the [new product naming](http://ez.no/Blog/eZ-Announces-Na ### eZ Platform Enterprise Edition (with Studio) -- You can now use our eZ Personalization service to create highly personalized landing pages. The Studio **Personalization Block** available out of the box lets the editor simply create a block that renders a list of content items personalized to each and every visitor. The interface lets the editor decide which of the Personalization scenarios configured in the eZ Personalization back end should be used, as well as the template to be used for rendering. +- You can now use eZ Personalization service to create highly personalized landing pages. +The Studio **Personalization Block** available out of the box lets the editor create a block that renders a list of content items personalized to each and every visitor. +The interface lets the editor decide which of the Personalization scenarios configured in the eZ Personalization back end, and also the template for rendering, should be used. ![](personalizationblock.png) -- You can now take advantage of the **Date-Based Publishing** feature – when editing a draft, instead of publishing the content immediately you can select the date and time at which it's automatically published. All your content scheduled to be published are accessible in a dedicated widget on the dashboard. +- You can now take advantage of the **Date-Based Publishing** feature – when editing a draft, instead of publishing the content immediately you can select the date and time at which it's automatically published. All your content scheduled to be published are accessible in a dedicated widget on the dashboard. ![](future_publication_window.png) -- Create forms in your Landing Page using the **Form Builder**. A special Form Block allows you to add forms with different types of fields to the Landing Page. This system has been designed to be extended, so that you can create your own form fields. The system also provide an interface to access the data that has been collected, and download it as CSV files. +- Create forms in your landing page using the **Form Builder**. A special Form Block allows you to add forms with different types of fields to the landing page. This system has been designed to be extended, so that you can create your own form fields. The system also provide an interface to access the data that has been collected, and download it as CSV files. ![](form-builder-1.png) diff --git a/docs/release_notes/ez_platform_v1.8.0.md b/docs/release_notes/ez_platform_v1.8.0.md index 5ac63c0465..d98504e5a1 100644 --- a/docs/release_notes/ez_platform_v1.8.0.md +++ b/docs/release_notes/ez_platform_v1.8.0.md @@ -29,7 +29,7 @@ If you're looking for the Long Term Support (LTS) release, see[ https://ezplatf #### Under the Hood -- New opt-in approach to HttpCache to improve usability as well as performance by means of: +- New opt-in approach to HttpCache to improve usability and performance by means of: - Cache multi-tagging: allowing you to tag pages with a path, location, type, parent, etc. so the repository can clear cache in a more targeted, accurate, and flexible way, getting rid of any "clear all" situations on complex operations. - For Varnish this uses [xkey](https://github.com/varnish/varnish-modules/blob/master/docs/vmod_xkey.rst) instead of BAN, enabling greater performance by allowing you to control grace time. - This also places HttpCache in a separate repo, allowing it to grow independently: see  diff --git a/docs/release_notes/ez_platform_v1.9.0.md b/docs/release_notes/ez_platform_v1.9.0.md index 7a6b366e13..7ff62bd851 100644 --- a/docs/release_notes/ez_platform_v1.9.0.md +++ b/docs/release_notes/ez_platform_v1.9.0.md @@ -40,7 +40,7 @@ In version 1.8 we introduced a new Content Browser in the Universal Discovery Wi ### eZ Platform Enterprise Edition - Studio -- It's now possible to configure Landing Page blocks used by the Landing Page editor in a simpler way. The configuration is done in a YAML file (see ) +- It's now possible to configure landing page blocks used by the landing page editor in a simpler way. The configuration is done in a YAML file (see ) - *..lots of other bug fixes and smaller improvements..* ### eZ Platform Enterprise Edition - Studio Demo diff --git a/docs/release_notes/ez_platform_v2.2.0.md b/docs/release_notes/ez_platform_v2.2.0.md index 16dada0406..133c5cddaa 100644 --- a/docs/release_notes/ez_platform_v2.2.0.md +++ b/docs/release_notes/ez_platform_v2.2.0.md @@ -12,13 +12,13 @@ ### Page Builder -This version introduces the **Page Builder** which replaces the Landing Page editor from earlier versions. +This version introduces the **Page Builder** which replaces the landing page editor from earlier versions. ![Page Builder](2.2_page_builder.png) !!! note - The Page Builder does not offer all blocks that Landing Page editor did. + The Page Builder does not offer all blocks that landing page editor did. The removed blocks include Schedule and Form blocks. They will be included again in a future release. @@ -27,7 +27,7 @@ This version introduces the **Page Builder** which replaces the Landing Page edi #### Modifying the Page content type -You can edit the new Page content type by adding Fields, as well as create new content types with the Page field type. +You can edit the new Page content type by adding Fields and create new content types with the Page field type. ![Editing Fields in Page Builder](2.2_page_builder_edit_fields.png) @@ -41,7 +41,7 @@ In the Page block config you can now specify the CSS class with its own style fo Refer to [Updating eZ Platform](https://doc.ibexa.co/en/2.5/updating/5_update_2.2) for a database update script. - To update to 2.2 with existing Content you need a [dedicated script for converting the Landing Page into the new Page](https://doc.ibexa.co/en/2.5/updating/5_update_2.2/#migrate-landing-pages). + To update to 2.2 with existing Content you need a [dedicated script for converting the landing page into the new Page](https://doc.ibexa.co/en/2.5/updating/5_update_2.2/#migrate-landing-pages). ### Bookmarks diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 40aac81bba..0f427fea50 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -253,7 +253,7 @@ This section provides a list of deprecated features to be removed in eZ Platform ### Configuration through `ezplatform` -In YAML configuration, you can now use `ezplatform` as well as `ezpublish` as the main configuration key. +In YAML configuration, you can now use `ezplatform` and `ezpublish` as the main configuration key. ### API improvements diff --git a/docs/release_notes/ez_platform_v3.0_deprecations.md b/docs/release_notes/ez_platform_v3.0_deprecations.md index d37251e092..682564dd87 100644 --- a/docs/release_notes/ez_platform_v3.0_deprecations.md +++ b/docs/release_notes/ez_platform_v3.0_deprecations.md @@ -12,11 +12,7 @@ This page lists backwards compatibility breaks and deprecations introduced in eZ ## Symfony 5 v3.0 now uses Symfony 5 instead of Symfony 3. -Refer to [Symfony changelog for 4.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-4.0.md) -and [for 5.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-5.0.md) -as well as [Symfony upgrade guides for 4.0](https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md) -and [for 5.0](https://github.com/symfony/symfony/blob/master/UPGRADE-5.0.md) -to learn about all changes it entails. +Refer to [Symfony changelog for 4.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-4.0.md), [for 5.0](https://github.com/symfony/symfony/blob/master/CHANGELOG-5.0.md), [Symfony upgrade guides for 4.0](https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md), and [for 5.0](https://github.com/symfony/symfony/blob/master/UPGRADE-5.0.md) to learn about all changes it entails. See [v3.0 project update](adapt_code_to_v3.md) for the steps you need to take to update your project to Symfony 5. See also [full requirements for installing eZ Platform](https://doc.ibexa.co/en/latest/getting_started/requirements). diff --git a/docs/release_notes/ez_platform_v3.1.md b/docs/release_notes/ez_platform_v3.1.md index 7549071af4..8aa9a118c6 100644 --- a/docs/release_notes/ez_platform_v3.1.md +++ b/docs/release_notes/ez_platform_v3.1.md @@ -33,16 +33,16 @@ This release of eZ Platform introduces the following new features: You can now define the parent Location for every new site in the template configuration. For more information about defining parent Location, see [Configure parent Location](https://doc.ibexa.co/en/latest/guide/multisite/site_factory_configuration/#parent-location). - + ### Elasticsearch - + You can now use [Elasticsearch](https://www.elastic.co/) in your eZ Platform installation through the `PlatformElasticSearchEngineBundle`. - + See [Elasticsearch documentation](https://doc.ibexa.co/en/latest/guide/search/elastic) to learn how to set up, configure and user Elasticsearch with eZ Platform. - + ### Page Builder - + You can now filter elements in the sidebar during site creation process to get to the desired blocks faster. ![](3_1_filter_elements.png) @@ -51,21 +51,22 @@ This release of eZ Platform introduces the following new features: The new [field group limitation](https://doc.ibexa.co/en/latest/guide/limitation_reference/#field-group-limitation) enables you to control who can edit content fields per field group. - + ### Version comparison - + You can now compare additional fields in version comparison of content item: - + - Content Relation and Content Relations - Image Asset and Image - Matrix - Media - + For overview of additional fields, see [User documentation on Comparing versions]([[= user_doc =]]/publishing/publishing/#comparing-versions). ### URL management UI -You can now manage URL addresses and URL wildcards with a comfortable user interface that is available in the back office. You can create, modify and delete URL wildcards, as well as decide if the user should be redirected to the new address on clicking the link. +You can now manage URL addresses and URL wildcards with a comfortable user interface that is available in the back office. +You can create, modify or delete URL wildcards, and decide if the user should be redirected to the new address on clicking the link. !!! note @@ -134,9 +135,9 @@ You can now have a Service that provides both `PermissionResolver` and `Permissi ## Behavior changes -### Landing Page drafts +### Landing page drafts -When you start creating a Landing Page, a new draft is now automatically created. +When you start creating a landing page, a new draft is now automatically created. ## Deprecations diff --git a/docs/release_notes/ibexa_dxp_v3.2.md b/docs/release_notes/ibexa_dxp_v3.2.md index c9f858274b..319a06c776 100644 --- a/docs/release_notes/ibexa_dxp_v3.2.md +++ b/docs/release_notes/ibexa_dxp_v3.2.md @@ -50,8 +50,7 @@ depending on the Segments they belong to. You can [configure Segments](https://doc.ibexa.co/en/latest/guide/admin_panel/#segments) in the back office. -[Segmentation API](https://doc.ibexa.co/en/latest/api/public_php_api_managing_users/#segments) enables you to create and edit Segments and Segment Groups, -as well as assign Users to Segments. +[Segmentation API](https://doc.ibexa.co/en/latest/api/public_php_api_managing_users/#segments) enables you to create and edit Segments and Segment Groups, and assign Users to Segments. ### Twig helpers for content rendering diff --git a/docs/release_notes/ibexa_dxp_v4.2.md b/docs/release_notes/ibexa_dxp_v4.2.md index 105b6fdc2b..64e9093a95 100644 --- a/docs/release_notes/ibexa_dxp_v4.2.md +++ b/docs/release_notes/ibexa_dxp_v4.2.md @@ -67,7 +67,7 @@ The system automatically generates variants for the attribute values you select. ![Generating product variants](4.2_product_variants_generate.png) -You can set prices, including custom pricing, as well as availability and stock for each variant separately. +You can set prices, including custom pricing, availability, and stock for each variant separately. ### Product assets diff --git a/docs/release_notes/ibexa_dxp_v4.3.md b/docs/release_notes/ibexa_dxp_v4.3.md index d1924b1e7d..3f8bc46a66 100644 --- a/docs/release_notes/ibexa_dxp_v4.3.md +++ b/docs/release_notes/ibexa_dxp_v4.3.md @@ -73,8 +73,7 @@ From product's Completeness tab you can now jump directly to editing the product #### Catalog filters -In catalogs, you can now [configure default filters](https://doc.ibexa.co/en/master/pim/pim_configuration/#catalog-filters) that are always added to a catalog, -as well as define filter order and group custom filters. +In catalogs, you can now [configure default filters](https://doc.ibexa.co/en/master/pim/pim_configuration/#catalog-filters) that are always added to a catalog, define filter order, and group custom filters. Built-in filters are also divided into groups now for easier browsing. Filtering by the Color attribute is now possible. diff --git a/docs/release_notes/ibexa_dxp_v4.5.md b/docs/release_notes/ibexa_dxp_v4.5.md index f06dc7cdd1..aa236f5463 100644 --- a/docs/release_notes/ibexa_dxp_v4.5.md +++ b/docs/release_notes/ibexa_dxp_v4.5.md @@ -29,17 +29,17 @@ Modules can interact with each other, for example, to decrease stock as a result #### Order management -With order management in place, it's now possible to create orders, configure and customize the order processing workflow, as well as manage orders by using the APIs. +With order management in place, it's now possible to create orders, configure and customize the order processing workflow, and manage orders by using the APIs. New screens added to the back office user interface let [[= product_name =]] users search for orders and filter search results. -Users can also review order details and completion status, as well as cancel orders. +Users can also review order details and completion status, and cancel orders. ![The order list screen](img/4.5_order_list.png "The order list screen") #### Payment The all-new Payment module brings a possibility of tracking payment progress and defining a custom payment processing workflow. -New back office screens allow users to search for payment methods and payments, as well as define, enable and disable offline payment methods. +New back office screens allow users to search for payment methods and payments, and also define, enable, and disable offline payment methods. Additionally, new APIs are available, which can be used for managing payment methods and payments. @@ -47,7 +47,8 @@ Additionally, new APIs are available, which can be used for managing payment met #### Shipping -With the arrival of the Shipping module, it's now possible to define and manage shipping methods of different types, together with their related costs, on a dedicated back office screen, as well as configure and customize the shipment workflow. +With the arrival of the Shipping module, it's now possible to define and manage shipping methods of different types, together with their related costs, on a dedicated back office screen. +You can now also configure and customize the shipment workflow. New APIs enable managing shipping methods and payments, while an extension point can be used to expand the default list of shipping method types. diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index 182732e9ff..5586d64a0a 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -180,7 +180,7 @@ Also, content type icons have changed slightly. ### Ibexa Image picker -Editors can now use a Digital Asset Management platform that enables storing media assets in a central location, as well as organizing, distributing, and sharing them across many channels. +Editors can now use a Digital Asset Management platform that enables storing media assets in a central location, organizing, distributing, and sharing them across many channels. For more information, see [Ibexa DAM](https://doc.ibexa.co/projects/userguide/en/master/dam/ibexa_dam/). diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md index 6d0093ab8b..abd528171f 100644 --- a/docs/resources/new_in_doc.md +++ b/docs/resources/new_in_doc.md @@ -485,23 +485,15 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Payment -- [Payment management](https://doc.ibexa.co/en/master/commerce/payment/payment/), -including [configuring payment workflow](https://doc.ibexa.co/en/master/commerce/payment/configure_payment/), -as well as [payment](https://doc.ibexa.co/en/master/commerce/payment/payment_api/) -and [payment method PHP API](https://doc.ibexa.co/en/master/commerce/payment/payment_method_api/). +- [Payment management](https://doc.ibexa.co/en/master/commerce/payment/payment/), including [configuring payment workflow](https://doc.ibexa.co/en/master/commerce/payment/configure_payment/), [payment](https://doc.ibexa.co/en/master/commerce/payment/payment_api/), and [payment method PHP API](https://doc.ibexa.co/en/master/commerce/payment/payment_method_api/). ### Orders -- [Order management](https://doc.ibexa.co/en/master/commerce/order_management/order_management/), -including [configuring order workflow](https://doc.ibexa.co/en/master/commerce/order_management/configure_order_management/) -and [Orders REST API reference](https://doc.ibexa.co/en/master/api/rest_api/rest_api_reference/rest_api_reference.html#orders). +- [Order management](https://doc.ibexa.co/en/master/commerce/order_management/order_management/), including [configuring order workflow](https://doc.ibexa.co/en/master/commerce/order_management/configure_order_management/) and [Orders REST API reference](https://doc.ibexa.co/en/master/api/rest_api/rest_api_reference/rest_api_reference.html#orders). ### Shipping -- [Shipping management](https://doc.ibexa.co/en/master/commerce/shipping_management/shipping_management/), -including [configuring shipment workflow](https://doc.ibexa.co/en/master/commerce/shipping_management/configure_shipment/), -as well as [shipment](https://doc.ibexa.co/en/master/commerce/shipping_management/shipment_api/) -and [shipping method PHP API](https://doc.ibexa.co/en/master/commerce/shipping_management/shipping_method_api/). +- [Shipping management](https://doc.ibexa.co/en/master/commerce/shipping_management/shipping_management/), including [configuring shipment workflow](https://doc.ibexa.co/en/master/commerce/shipping_management/configure_shipment/), [shipment](https://doc.ibexa.co/en/master/commerce/shipping_management/shipment_api/), and [shipping method PHP API](https://doc.ibexa.co/en/master/commerce/shipping_management/shipping_method_api/). ### Search @@ -548,10 +540,7 @@ and [extend Storefront](https://doc.ibexa.co/en/master/commerce/storefront/exten ### Checkout -- [Checkout](https://doc.ibexa.co/en/master/commerce/checkout/checkout/) documentation, -including how to [configure checkout](https://doc.ibexa.co/en/master/commerce/checkout/configure_checkout/). -Description of main [PHP API methods](https://doc.ibexa.co/en/master/commerce/checkout/checkout_api/) -as well as [checkout-related Twig functions](https://doc.ibexa.co/en/master/templating/twig_function_reference/checkout_twig_functions/). +- [Checkout](https://doc.ibexa.co/en/master/commerce/checkout/checkout/) documentation, including [how to configure checkout](https://doc.ibexa.co/en/master/commerce/checkout/configure_checkout/), description of main [PHP API methods](https://doc.ibexa.co/en/master/commerce/checkout/checkout_api/), and [checkout-related Twig functions](https://doc.ibexa.co/en/master/templating/twig_function_reference/checkout_twig_functions/). ### Other diff --git a/docs/search/search_engines/elastic_search/configure_elastic_search.md b/docs/search/search_engines/elastic_search/configure_elastic_search.md index 9845452c1f..2553deffe5 100644 --- a/docs/search/search_engines/elastic_search/configure_elastic_search.md +++ b/docs/search/search_engines/elastic_search/configure_elastic_search.md @@ -33,8 +33,7 @@ ibexa_elasticsearch: default_connection: ``` -Now, you need to decide whether to add a cluster that you administer and manage yourself, or use a cloud -solution from Elastic, as well as configure additional parameters. +Now, you need to decide whether to add a cluster that you administer and manage yourself, or use a cloud solution from Elastic, and configure additional parameters. If you want to connect by using a cluster, follow the instructions below in the [Cluster](#configure-clustering) section. If you want to use Elasticsearch Cloud, skip to [Elasticsearch Cloud](#configure-elasticsearch-cloud) section. diff --git a/docs/templating/layout/add_breadcrumbs.md b/docs/templating/layout/add_breadcrumbs.md index f1cfcde821..b1bd64f592 100644 --- a/docs/templating/layout/add_breadcrumbs.md +++ b/docs/templating/layout/add_breadcrumbs.md @@ -6,8 +6,7 @@ description: Add and render a breadcrumbs element on your site. To add breadcrumbs to your website, first prepare a general layout template in a `templates/themes//pagelayout.html.twig` file. -This template can contain things such as header, menu, footer, as well as [assets](assets.md) for the whole site, -and all other templates [extend](templates.md#connecting-templates) it. +This template can contain things such as header, menu, footer, and [assets](assets.md) for the whole site, and all other templates [extend](templates.md#connecting-templates) it. Then, to render breadcrumbs, create a `BreadcrumbController.php` file in `src/Controller`: diff --git a/docs/templating/layout/add_navigation_menu.md b/docs/templating/layout/add_navigation_menu.md index ab1245d479..31d403ecb1 100644 --- a/docs/templating/layout/add_navigation_menu.md +++ b/docs/templating/layout/add_navigation_menu.md @@ -6,8 +6,7 @@ description: Enrich you site front with a menu displaying selected content items To add a navigation menu to your website, prepare a general layout template in a `templates/themes//pagelayout.html.twig` file. -This template can contain things such as header, menu, footer, as well as [assets](assets.md) for the whole site, -and all other templates [extend](templates.md#connecting-templates) it. +This template can contain things such as header, menu, footer, and [assets](assets.md) for the whole site, and all other templates [extend](templates.md#connecting-templates) it. To select items that should be rendered in the menu, you can use one of the following ways: diff --git a/docs/templating/templates/templates.md b/docs/templating/templates/templates.md index 2b8000627a..71081dd0fb 100644 --- a/docs/templating/templates/templates.md +++ b/docs/templating/templates/templates.md @@ -40,8 +40,7 @@ The parent template (in this case, `pagelayout.html.twig`) must leave a place fo ## Template variables -In templates, you can use variables related to the current content item, -as well as general variables related to the current view and general application settings. +In templates, you can use variables related to the current content item, and general variables related to the current view and general application settings. [[= include_file('docs/snippets/rendering_dump_variable.md') =]] diff --git a/docs/templating/twig_function_reference/checkout_twig_functions.md b/docs/templating/twig_function_reference/checkout_twig_functions.md index ad0a5b9ee5..70060af672 100644 --- a/docs/templating/twig_function_reference/checkout_twig_functions.md +++ b/docs/templating/twig_function_reference/checkout_twig_functions.md @@ -6,8 +6,7 @@ page_type: reference # Checkout Twig functions -You can use checkout Twig functions to get information about the checkout process, -as well as total values related to cart and cart items. +You can use checkout Twig functions to get information about the checkout process, and total values related to cart and cart items. ### `ibexa_checkout_step_label()` diff --git a/docs/templating/twig_function_reference/field_twig_functions.md b/docs/templating/twig_function_reference/field_twig_functions.md index b941a71846..0a8e3ca08d 100644 --- a/docs/templating/twig_function_reference/field_twig_functions.md +++ b/docs/templating/twig_function_reference/field_twig_functions.md @@ -1,39 +1,39 @@ --- -description: Field Twig function enable rendering content Fields, their values and their information. +description: Field Twig function enable rendering content fields, their values and their information. page_type: reference --- # Field Twig functions -Field Twig functions render specific Fields of a content item +Field Twig functions render specific fields of a content item and provide information about them. -- [`ibexa_render_field()`](#ibexa_render_field) renders the selected Field of a content item. -- [`ibexa_field_value()`](#ibexa_field_value) returns the Field value object. -- [`ibexa_field()`](#ibexa_field) returns the Field object. +- [`ibexa_render_field()`](#ibexa_render_field) renders the selected field of a content item. +- [`ibexa_field_value()`](#ibexa_field_value) returns the field value object. +- [`ibexa_field()`](#ibexa_field) returns the field object. `ibexa_field()` returns the *Field object*, and `ibexa_field_value()` returns the *Field's raw value*. -`ibexa_render_field()` is the Twig function intended for rendering the Field on the front page. +`ibexa_render_field()` is the Twig function intended for rendering the field on the front page. -You can get additional information about a Field by using the following Twig functions: +You can get additional information about a field by using the following Twig functions: -- [`ibexa_field_name()`](#ibexa_field_name) returns the name of a content item's Field. -- [`ibexa_field_description()`](#ibexa_field_description) returns the description of a content item's Field. -- [`ibexa_field_is_empty()`](#ibexa_field_is_empty) returns Boolean information whether a Field of a content item is empty. -- [`ibexa_field_group_name()`](#ibexa_field_group_name) returns a human-readable name of the Field group. -- [`ibexa_has_field()`](#ibexa_has_field) checks whether a Field is present in the content item. +- [`ibexa_field_name()`](#ibexa_field_name) returns the name of a content item's field. +- [`ibexa_field_description()`](#ibexa_field_description) returns the description of a content item's field. +- [`ibexa_field_is_empty()`](#ibexa_field_is_empty) returns Boolean information whether a field of a content item is empty. +- [`ibexa_field_group_name()`](#ibexa_field_group_name) returns a human-readable name of the field group. +- [`ibexa_has_field()`](#ibexa_has_field) checks whether a field is present in the content item. ## Field rendering ### `ibexa_render_field()` -`ibexa_render_field()` renders the selected Field of a content item. -The Field is rendered with the default template, but you can optionally pass a different template as parameter as well. +`ibexa_render_field()` renders the selected field of a content item. +The field is rendered with the default template, but you can optionally pass a different template as parameter as well. | Argument | Type | Description | | ------ | ----- | ----- | -| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the Field belongs to. | +| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the field belongs to. | | `fieldDefinitionIdentifier` | `string` | Field identifier. | | `params` | `hash` | (optional) Hash of parameters passed to the template block. | @@ -53,8 +53,8 @@ The Field is rendered with the default template, but you can optionally pass a d You can pass the following parameters to `ibexa_render_field()`: -- `lang` - language to render the Field in (overrides the current language), must be a valid locale in xxx-YY format -- `template` - Field template to use +- `lang` - language to render the field in (overrides the current language), must be a valid locale in xxx-YY format +- `template` - field template to use - `attr` - hash of HTML attributes to add to the tag - parameters - arbitrary parameters to pass to the template block. Some field types, like the [MapLocation field type](maplocationfield.md), expect specific parameters. @@ -73,17 +73,17 @@ Some field types, like the [MapLocation field type](maplocationfield.md), expect ### `ibexa_field_value()` -`ibexa_field_value()` returns the Field value object. +`ibexa_field_value()` returns the field value object. -The function returns the value of the Field only. -To render the Field with default or custom templates, use [`ibexa_render_field()`](#ibexa_render_field) instead. +The function returns the value of the field only. +To render the field with default or custom templates, use [`ibexa_render_field()`](#ibexa_render_field) instead. If the content item does not have a translation in the prioritized or passed language, the function returns the value in the main language. | Argument | Type | Description | |-----|------|-----| -| `content`| `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the Field belongs to.| -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content`| `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the field belongs to.| +| `fieldDefIdentifier` | `string` | Identifier of the field. | | `forcedLanguage` | `string` | (optional) Language to use (for example, "fre-FR"). | ``` html+twig @@ -92,18 +92,18 @@ the function returns the value in the main language. ### `ibexa_field()` -`ibexa_field()` returns the Field object. -The Field gives you access to the Field value, as well as the Field's definition identifier and field type identifier. +`ibexa_field()` returns the field object. +The field gives you access to the field value, the field's definition identifier, and field type identifier. If the content item does not have a translation in the prioritized or passed language, -the function returns the Field object in the main language. +the function returns the field object in the main language. | Argument | Type | Description | |-------|------|------| -| `content`| `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the Field belongs to.| -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content`| `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the field belongs to.| +| `fieldDefIdentifier` | `string` | Identifier of the field. | | `forcedLanguage` | `string` | {optional) Language to use (for example, "fre-FR"). | -You can access the Field's value by using `(ibexa_field(content, 'my_field').value)`, +You can access the field's value by using `(ibexa_field(content, 'my_field').value)`, but it's recommended to use the dedicated [`ibexa_field_value()`](#ibexa_field_value) function for this. You can use `ibexa_field()` to access the field type identifier: @@ -116,7 +116,7 @@ You can use `ibexa_field()` to access the field type identifier: ### `ibexa_field_name()` -`ibexa_field_name()` returns the name of a content item's Field. +`ibexa_field_name()` returns the name of a content item's field. The function uses prioritized languages from SiteAccess settings unless you pass another language as `forcedLanguage`. If the content item does not have a translation in the prioritized or passed language, @@ -124,8 +124,8 @@ the function returns the name in the main language. | Argument | Type | Description | |---------------|------|-------------| -| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the Field belongs to. | -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the field belongs to. | +| `fieldDefIdentifier` | `string` | Identifier of the field. | | `forcedLanguage` | `string` | (optional) Language to use (for example, `fre-FR`). | @@ -137,7 +137,7 @@ the function returns the name in the main language. ### `ibexa_field_description()` -`ibexa_field_description()` returns the description of a content item's Field. +`ibexa_field_description()` returns the description of a content item's field. The function uses prioritized languages from SiteAccess settings unless you pass another language as `forcedLanguage`. If the content item does not have a translation in the prioritized or passed language, @@ -145,8 +145,8 @@ the function returns the description in the main language. | Argument | Type | Description | |---------------|------|-------------| -| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the Field belongs to. | -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the field belongs to. | +| `fieldDefIdentifier` | `string` | Identifier of the field. | | `forcedLanguage` | `string` | (optional) Language to use (for example, `fre-FR`). | ``` html+twig @@ -157,12 +157,12 @@ the function returns the description in the main language. ### `ibexa_field_is_empty()` -`ibexa_field_is_empty()` returns Boolean information whether a given Field of a content item is empty. +`ibexa_field_is_empty()` returns Boolean information whether a given field of a content item is empty. | Argument | Type | Description | |---------------|------|-------------| -| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the Field belongs to. | -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` or `Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo` | Content item the field belongs to. | +| `fieldDefIdentifier` | `string` | Identifier of the field. | | `forcedLanguage` | `string` | (optional) Language to use (for example, `fre-FR`). | ``` html+twig @@ -171,7 +171,7 @@ the function returns the description in the main language. #### Examples -For example, use `ibexa_field_is_empty()` to check whether a Field is empty or filled before rendering it: +For example, use `ibexa_field_is_empty()` to check whether a field is empty or filled before rendering it: ``` html+twig {% if not ibexa_field_is_empty(content, 'image') %} @@ -181,7 +181,7 @@ For example, use `ibexa_field_is_empty()` to check whether a Field is empty or f ### `ibexa_field_group_name()` -`ibexa_field_group_name()` returns a human-readable name of a Field group. +`ibexa_field_group_name()` returns a human-readable name of a field group. | Argument | Type | Description | |---------------|------|-------------| @@ -194,12 +194,12 @@ For example, use `ibexa_field_is_empty()` to check whether a Field is empty or f ### `ibexa_has_field()` -`ibexa_has_field()` returns Boolean information whether a Field is present in the content item. +`ibexa_has_field()` returns Boolean information whether a field is present in the content item. | Argument | Type | Description | |---------------|------|-------------| -| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the Field may belong to. | -| `fieldDefIdentifier` | `string` | Identifier of the Field. | +| `content` | `Ibexa\Contracts\Core\Repository\Values\Content\Content` | Content item the field may belong to. | +| `fieldDefIdentifier` | `string` | Identifier of the field. | ``` html+twig {% if ibexa_has_field(content, 'existing') %} diff --git a/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md b/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md index a479c7edcb..fd183c140f 100644 --- a/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md +++ b/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md @@ -23,9 +23,9 @@ Go to the front page of your website (``). You can see that it looks Log in to the back office. Go to **Content Structure**. The **Ibexa Digital Experience Platform** content item is the first page that is shown to the visitor. -Here you can check what content type it belongs to: it's a Landing Page. +Here you can check what content type it belongs to: it's a landing page. -![Ibexa Digital Experience Platform is a Landing Page](enterprise_tut_home_is_an_lp.png) +![Ibexa Digital Experience Platform is a landing page](enterprise_tut_home_is_an_lp.png) The page contains one Code block and is displayed without any template. Click Edit to enter a mode that enables you to work with Pages. @@ -61,7 +61,7 @@ First create a new file for layout configuration, `config/packages/ibexa_fieldty For a detailed description of creating a Page layout, see [Page layouts](render_page.md#render-a-layout). The `sidebar` (line 3) is the internal key of the layout. `name` (line 5) is displayed in the interface when the user selects a layout. -The `thumbnail` (line 7) points to an image file that is shown when creating a new Landing Page next to the name. +The `thumbnail` (line 7) points to an image file that is shown when creating a new landing page next to the name. Use the [supplied thumbnail file](https://github.com/ibexa/documentation-developer/blob/master/code_samples/tutorials/page_tutorial_starting_point/public/assets/images/layouts/sidebar.png) and place it in the `public/assets/images/layouts/` folder. The `template` (line 8) points to the Twig file containing the template for this layout. diff --git a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md index 8b21185699..ee8bfe3b73 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md @@ -54,9 +54,9 @@ doctrine: Also make the corresponding change in `app/config/dfs/dfs.yml`. -#### Migrate Landing Pages +#### Migrate landing pages -To update to v2.2 with existing Landing Pages, you need to use a dedicated script. +To update to v2.2 with existing landing pages, you need to use a dedicated script. The script is contained in the `ezplatform-page-migration` bundle and **works since version v2.2.2**. To use the script: @@ -66,32 +66,32 @@ To use the script: !!! tip - This script uses the layout defined in your Landing Page. + This script uses the layout defined in your landing page. To migrate successfully, you need to copy your zone configuration from `ez_systems_landing_page_field_type` under `ezplatform_page_fieldtype` in the new config. Otherwise the script encounters errors. You can remove the bundle after the migration is complete. -The `ezplatform:page:migrate` command migrates Landing Pages created in eZ Platform v1.x, v2.0 and v2.1 to new Pages. +The `ezplatform:page:migrate` command migrates landing pages created in eZ Platform v1.x, v2.0 and v2.1 to new Pages. The operation is transactional and rolls back in case of errors. !!! caution "Avoid exception when migrating from eZ Publish" - If you [migrated to v1.13 from eZ Publish](migrating_from_ez_publish.md), and want to upgrade to v2.5, an exception occurs when you run the `bin/console ezplatform:page:migrate` command and the database contains internal drafts of Landing Pages. + If you [migrated to v1.13 from eZ Publish](migrating_from_ez_publish.md), and want to upgrade to v2.5, an exception occurs when you run the `bin/console ezplatform:page:migrate` command and the database contains internal drafts of landing pages. To avoid this exception, you must first [remove all internal drafts before you migrate](migrating_from_ez_publish.md#migration_exception). ##### Block migration -In v2.2 Page Builder does not offer all blocks that Landing Page editor did. The removed blocks include Keyword, Schedule, and Form blocks. +In v2.2 Page Builder does not offer all blocks that landing page editor did. The removed blocks include Keyword, Schedule, and Form blocks. The Places block has been removed from the clean installation and is only available in the demo out of the box. If you use this block in your site, re-apply its configuration based on the [demo](https://github.com/ezsystems/ezplatform-ee-demo/blob/v2.2.2/app/config/blocks.yml). Later versions of Page Builder come with a Content Scheduler block and new Form Blocks, but migration of Schedule blocks to Content Scheduler blocks and of Form Blocks isn't supported. If there are missing block definitions, such as Form Block or Schedule Block, -you have an option to continue, but migrated Landing Pages come without those blocks. +you have an option to continue, but migrated landing pages come without those blocks. !!! tip @@ -112,7 +112,7 @@ See [documentation](render_page.md#render-a-layout) for an example on usage of t ###### Migrate custom blocks -Landing Page blocks (from v2.1 and earlier) were defined using a class implementing `EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType`. +Landing page blocks (from v2.1 and earlier) were defined using a class implementing `EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType`. In Page Builder (from v2.2 onwards), this interface is no longer present. Instead the logic of your block must be implemented in a [Listener](page_blocks.md#block-events). Typically, what you previously would do in `getTemplateParameters()`, you'll now do in the `onBlockPreRender()` event handler. @@ -120,7 +120,7 @@ The definition of block parameters has to be moved from `createBlockDefinition() For more information about how custom blocks are implemented in Page Builder, have a look at [Creating custom Page blocks](create_custom_page_block.md) for your custom blocks. -For the migration of blocks from Landing Page to Page Builder, you'll need to provide a converter for attributes of custom blocks. For simple blocks you can use `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\DefaultConverter`. +For the migration of blocks from landing page to Page Builder, you'll need to provide a converter for attributes of custom blocks. For simple blocks you can use `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\DefaultConverter`. Custom converters must implement the `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\ConverterInterface` interface. `convert()` parses XML `\DOMNode $node` and return an array of `\EzSystems\EzPlatformPageFieldType\FieldType\LandingPage\Model\Attribute` objects. @@ -139,10 +139,10 @@ This converter is only needed when running the `ezplatform:page:migrate` script ###### Page migration example -Below is an example how to migrate a Landing Page Layout and Block to new Page Builder. The code is based on the Random block +Below is an example how to migrate a landing page Layout and Block to new Page Builder. The code is based on the Random block defined in the [Enterprise Beginner tutorial](page_and_form_tutorial.md) -??? tip "Landing Page code" +??? tip "Landing page code" `app/Resources/views/layouts/sidebar.html.twig`: @@ -680,7 +680,7 @@ You can find it in https://github.com/ezsystems/ezplatform-ee-installer/blob/2.3 !!! caution "Form (ezform) field type" After the update, in order to create forms, you have to add a new content type (for example, named "Form") that contains `Form` field (this content type can contain other fields - as well). After that you can use forms inside Landing Pages via Embed block. + as well). After that you can use forms inside landing pages via Embed block. ### C. Update to v2.4 diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md index 2f56258057..831f207988 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md @@ -46,7 +46,7 @@ See Upgrade documentation on how to perform the actual upgrade: [Upgrade (eZ Pub !!! caution "Avoid exception when migrating the database" - If you plan to migrate from from eZ Publish through eZ Publish Platform 5.4 to eZ Platform and further, an exception may occur when you try to migrate the database while it contains internal drafts of Landing Pages. + If you plan to migrate from from eZ Publish through eZ Publish Platform 5.4 to eZ Platform and further, an exception may occur when you try to migrate the database while it contains internal drafts of landing pages. This can happen because such drafts do not have an expected row in the `ezcontentobject_name` table. To avoid this exception, you must remove all internal drafts before you migrate. diff --git a/mkdocs.yml b/mkdocs.yml index 071875f83f..7b6f8b728c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -34,7 +34,7 @@ nav: - Page and Form tutorial: - Page and Form tutorial: tutorials/page_and_form_tutorial/page_and_form_tutorial.md - 1. Get a starter website: tutorials/page_and_form_tutorial/1_get_a_starter_website.md - - 2. Prepare the Landing Page: tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md + - 2. Prepare the landing page: tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md - 3. Use existing blocks: tutorials/page_and_form_tutorial/3_use_existing_blocks.md - 4. Create a custom block: tutorials/page_and_form_tutorial/4_create_a_custom_block.md - 5. Create a newsletter form: tutorials/page_and_form_tutorial/5_create_newsletter_form.md From 44e02298b9399937116d424b53347e80e92bb605 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Fri, 11 Oct 2024 14:54:05 +0200 Subject: [PATCH 11/77] Fixes --- .../configuration/configuration.md | 2 +- .../configuration/dynamic_configuration.md | 2 +- .../content_organization/content_types.md | 4 +- docs/api/graphql/graphql_operations.md | 2 +- docs/cdp/cdp.md | 9 +- docs/cdp/cdp_activation/cdp_data_export.md | 20 ++-- docs/cdp/cdp_data_customization.md | 10 +- docs/cdp/cdp_data_export_schedule.md | 4 +- docs/cdp/cdp_guide.md | 46 +++++---- docs/cdp/cdp_installation.md | 11 +-- docs/commerce/cart/cart.md | 43 +++----- docs/commerce/cart/cart_api.md | 33 +++---- docs/commerce/cart/quick_order.md | 6 +- docs/commerce/checkout/checkout.md | 36 +++---- docs/commerce/checkout/checkout_api.md | 19 ++-- docs/commerce/checkout/configure_checkout.md | 20 ++-- docs/commerce/checkout/customize_checkout.md | 28 +++--- docs/commerce/checkout/reorder.md | 4 +- .../configure_order_management.md | 15 ++- .../order_management/order_management_api.md | 8 +- .../content_api/browsing_content.md | 2 +- .../content_management_api/section_api.md | 2 +- .../content_management_guide.md | 98 ++++++++----------- .../field_type_reference/binaryfilefield.md | 4 +- .../field_type_reference/imagefield.md | 2 +- .../field_type_reference/mediafield.md | 2 +- .../field_type_reference/pagefield.md | 2 +- .../field_type_reference/richtextfield.md | 2 +- .../field_types/field_type_search.md | 2 +- .../field_types/field_type_storage.md | 16 +-- .../field_types/field_types.md | 8 +- .../pages/page_block_attributes.md | 2 +- .../cache/http_cache/content_aware_cache.md | 16 +-- .../cache/http_cache/context_aware_cache.md | 4 +- .../cache/persistence_cache.md | 4 +- .../security/development_security.md | 2 +- .../security/security_checklist.md | 3 +- .../support_and_maintenance_faq.md | 5 +- docs/multisite/languages/languages.md | 2 +- docs/release_notes/ez_platform_v1.11.0.md | 2 +- docs/release_notes/ez_platform_v2.0.0.md | 2 +- docs/release_notes/ez_platform_v2.2.0.md | 2 +- docs/release_notes/ez_platform_v2.4.md | 4 +- docs/release_notes/ez_platform_v2.5.md | 3 +- .../configure_elastic_search.md | 2 +- .../3_customize_the_front_page.md | 4 +- .../beginner_tutorial/7_embed_content.md | 4 +- .../4_introduce_a_template.md | 4 +- .../from_1.x_2.x/update_db_to_2.5.md | 4 +- .../from_2.5/adapt_code_to_v3.md | 8 +- .../from_4.3/update_from_4.3_old_commerce.md | 2 +- .../migrating_from_ez_publish_platform.md | 8 +- docs/users/customer_groups.md | 4 +- 53 files changed, 249 insertions(+), 304 deletions(-) diff --git a/docs/administration/configuration/configuration.md b/docs/administration/configuration/configuration.md index c40c0b1a49..725bf43707 100644 --- a/docs/administration/configuration/configuration.md +++ b/docs/administration/configuration/configuration.md @@ -57,7 +57,7 @@ Keys are usually prefixed by a *namespace* corresponding to your application. Al For configuration that is meant to be exposed to an end-user (or end-developer), it's usually a good idea to also [implement semantic configuration]([[= symfony_doc =]]/components/config/definition.html). -Note that you can also [implement SiteAccess-aware semantic configuration](siteaccess_aware_configuration.md). +You can also [implement SiteAccess-aware semantic configuration](siteaccess_aware_configuration.md). For example: diff --git a/docs/administration/configuration/dynamic_configuration.md b/docs/administration/configuration/dynamic_configuration.md index 7e9cad798c..33e22fb6ca 100644 --- a/docs/administration/configuration/dynamic_configuration.md +++ b/docs/administration/configuration/dynamic_configuration.md @@ -11,7 +11,7 @@ Dynamic configuration is handled by a ConfigResolver. It exposes the `hasParameter()` and `getParameter()` methods. You can use them to check the different *scopes* available for a given *namespace* to find the appropriate parameter. -In order to work with the ConfigResolver, your dynamic settings must have the following name format: `..parameter.name`. +To work with the ConfigResolver, your dynamic settings must have the following name format: `..parameter.name`. ``` yaml parameters: diff --git a/docs/administration/content_organization/content_types.md b/docs/administration/content_organization/content_types.md index 7aae698f9a..f992190b15 100644 --- a/docs/administration/content_organization/content_types.md +++ b/docs/administration/content_organization/content_types.md @@ -29,7 +29,7 @@ It can consist of letters, digits, spaces, and special characters (it's mandator !!! note - Note that even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), do not confuse it with this Name, which is a piece of metadata, not a field. + Even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), do not confuse it with this Name, which is a piece of metadata, not a field. **Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It must be unique, can only contain lowercase letters, digits, and underscores (it's mandatory and the maximum length is 50 characters). @@ -93,7 +93,7 @@ They determine what fields of what field types are included in all content items They're caused by the limitation of how many `$_POST` input variables can be accepted. The easiest way to fix them is by increasing the `max_input_vars` value in the `php.ini` configuration file. - Note that this solution isn't universally recommended and you're proceeding on your own risk. + This solution isn't universally recommended and you're proceeding on your own risk. Setting the limit inappropriately may damage your project or cause other issues. You may also experience performance problems with such large content types, in particular when you have many content items. diff --git a/docs/api/graphql/graphql_operations.md b/docs/api/graphql/graphql_operations.md index b8de7a692b..4bac2e3dd1 100644 --- a/docs/api/graphql/graphql_operations.md +++ b/docs/api/graphql/graphql_operations.md @@ -153,7 +153,7 @@ curl -v -X POST \ !!! note "Authentication" - Note that the example above requires you to set your authentication cookie in the `$AUTH_COOKIE` variable. + The example above requires you to set your authentication cookie in the `$AUTH_COOKIE` variable. See [Authentication](graphql.md#authentication) for more information. ### Uploading multiple files diff --git a/docs/cdp/cdp.md b/docs/cdp/cdp.md index 8e8127dd80..5c77b73db5 100644 --- a/docs/cdp/cdp.md +++ b/docs/cdp/cdp.md @@ -7,8 +7,7 @@ edition: experience ## What is Ibexa CDP -[[= product_name_cdp =]] helps you solve one of the hardest challenges facing business world today: -building unique experiences for your customers. +[[= product_name_cdp =]] helps you solve one of the hardest challenges facing business world today: building unique experiences for your customers. With [[= product_name_cdp =]] you're able to track and aggregate data of your customers' activity on multiple channels. It allows you to create individual customer profiles that enable you to personalize their experience on your platform. @@ -16,10 +15,8 @@ It allows you to create individual customer profiles that enable you to personal ## How it works -[[= product_name_cdp =]] unifies customer data across your organization -to help you activate your users and provide them with real-time engagement. -With defined audiences you can target your user segments at the right time, -through the most used channel, with the relevant message, content, or products. +[[= product_name_cdp =]] unifies customer data across your organization to help you activate your users and provide them with real-time engagement. +With defined audiences you can target your user segments at the right time, through the most used channel, with the relevant message, content, or products. The customer data are collected through the system of trackers embedded in different parts of your page. For more information on activation and trackers, see [CDP activation documentation](cdp_activation.md). diff --git a/docs/cdp/cdp_activation/cdp_data_export.md b/docs/cdp/cdp_activation/cdp_data_export.md index fe47a1f23b..bf7614765d 100644 --- a/docs/cdp/cdp_activation/cdp_data_export.md +++ b/docs/cdp/cdp_activation/cdp_data_export.md @@ -11,14 +11,12 @@ It takes you to a Dataflow Creator, where in five steps you can set up a data st ## General Information -In the **General Information** section, specify dataflow name, -choose **Stream File** as a source of user data and **CDP** as a destination, -where they're sent for processing. -Currently, only Stream File transport is supported and can be initialized from the configuration. +In the **General Information** section, specify dataflow name, choose **Stream File** as a source of user data and **CDP** as a destination, where they're sent for processing. +Currently, only Stream File transport is supported and can be initialized from the configuration. ## Download -In the **Download** section, select **Stream file**. +In the **Download** section, select **Stream file**. Copy generated steam ID and paste it into the configuration file under `stream_id`. It allows you to establish a datastream from the Streaming API into the Data Manager. @@ -67,7 +65,7 @@ At this point, you can map **email** to **email** and **id** to **integer** fie Next, select **Create schema based on the downloaded columns**. It moves you to Schema Creator. -There, choose **PersonalData** as a parent and name the schema. +There, choose **PersonalData** as a parent and name the schema. ![Create new schema](cdp_create_new_schema.png) @@ -75,8 +73,7 @@ Next, select all the columns and set Person Identifier as **userid**. ![Person Identifier](cdp_person_identifier.png) -If you used PersonData or Catalog type schemas, the system requires -specifying the Write Mode that is applied to them. +If you used PersonData or Catalog type schemas, the system requires specifying the Write Mode that is applied to them. **Append** (default one) allows new data to overwrite the old one but leaves existing entries unaffected. All entries are stored in the dataset, unchanged by updating dataflow. @@ -121,9 +118,12 @@ Specify name of your activation, select `userid` as **Person Identifier** and cl Next, you can fill in **Ibexa information** they must match the ones provided in the YAML configuration: -- **Client Secret** and **Client ID** - are used to authenticate against Webhook endpoint. In the configuration they're taken from environment variables in `.env` file. +- **Client Secret** and **Client ID** - are used to authenticate against Webhook endpoint. +In the configuration they're taken from environment variables in `.env` file. + +- **Segment Group Identifier** - identifier of the segment group in [[= product_name =]]. +It points to a segment group where all the CDP audiences are stored. -- **Segment Group Identifier** - identifier of the segment group in [[= product_name =]]. It points to a segment group where all the CDP audiences are stored. - **Base URL** - URL of your instance with added `/cdp/webhook` at the end. ![Ibexa Information - Activation](cdp_activation_ibexa_info.png) diff --git a/docs/cdp/cdp_data_customization.md b/docs/cdp/cdp_data_customization.md index e2a371c484..25f722c89b 100644 --- a/docs/cdp/cdp_data_customization.md +++ b/docs/cdp/cdp_data_customization.md @@ -11,10 +11,10 @@ It casts their `Value` object to string, thanks to `\Stringable` implementation. ​ ## Export field types ​ -Field types are exported with metadata, for example, ID, Field Definition name, type, value. -You can also provide your own `\Ibexa\Contracts\Cdp\Export\Content\FieldProcessorInterface` instance to extend metadata. -The provided implementation has to be defined as a service and tagged with `ibexa.cdp.export.content.field_processor`. -Additionally, you can specify `priority` to override the default behavior. +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` instance to extend metadata. +The provided implementation has to be defined as a service and tagged with `ibexa.cdp.export.content.field_processor`. +Additionally, you can specify `priority` to override the default behavior. All system Field Processors use `-100` priority, and any higher priority value overrides them. The interface is plain and has two methods that you need to provide: @@ -65,7 +65,7 @@ custom_fieldtype.cdp.export.field_processor: ## Export field type values ​ To customize export of field type values, provide your own `\Ibexa\Contracts\Cdp\Export\Content\FieldValueProcessorInterface` instance. -New implementation has to be registered as a service manually or by using autoconfiguration. +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. ​ diff --git a/docs/cdp/cdp_data_export_schedule.md b/docs/cdp/cdp_data_export_schedule.md index 3e277bca91..7102d57bc7 100644 --- a/docs/cdp/cdp_data_export_schedule.md +++ b/docs/cdp/cdp_data_export_schedule.md @@ -7,7 +7,7 @@ edition: experience ## Configuration key -Configuration in [[= product_name_cdp =]] allows you to automate the process of exporting Content, Users and Products. +Configuration in [[= product_name_cdp =]] allows you to automate the process of exporting content, users, and products. An `ibexa_cdp.data_export` [configuration key](configuration.md#configuration-files) looks as below: ```yaml @@ -37,7 +37,7 @@ ibexa_cdp: options: '--stream-id=00000000-00000000-00000000-00000000 --product-type=computer --no-draft' ``` -Under the `schedule` setting you can find separate sections for exporting User, Content, and Product. +Under the `schedule` setting you can find separate sections for exporting user, content, and product. Structure of each section is exactly the same and includes `interval` and `options` elements: - `interval` - sets the frequency of the command invoke, for example, '*/30 * * * *' means "every 30 minutes", '0 */12 * * *' means "every 12th hour". diff --git a/docs/cdp/cdp_guide.md b/docs/cdp/cdp_guide.md index b3241fa1b5..71ab5229d8 100644 --- a/docs/cdp/cdp_guide.md +++ b/docs/cdp/cdp_guide.md @@ -11,9 +11,10 @@ edition: experience By using [[= product_name_cdp =]] you can monitor and compile data about your customers' activity on multiple channels. It also allows you to create individual customer profiles so you can customize their experience on your platform. -With [[= product_name_cdp =]] you can store and manage large volumes of customer data in a structured manner. This central data storage supports business growth with a scalable infrastructure, helping to futureproof your business. +With [[= product_name_cdp =]] you can store and manage large volumes of customer data in a structured manner. +This central data storage supports business growth with a scalable infrastructure, helping to futureproof your business. You can get customer data from both online and offline data sources. -It includes first, second, and third-party data from multiple sources such as transactional systems, website tracking and behavior, POS, CRM, and others. +It includes first, second, and third-party data from multiple sources such as transactional systems, website tracking, and behavior, POS, CRM, and others. ## Availability @@ -21,7 +22,8 @@ It includes first, second, and third-party data from multiple sources such as tr ## How does Ibexa CDP work -[[= product_name_cdp =]] unifies customer data throughout your whole organization. It helps you activate your users and give them real-time interaction. +[[= product_name_cdp =]] unifies customer data throughout your whole organization. +It helps you activate your users and give them real-time interaction. You can target certain user segments with the appropriate message, content, or products at the right time through the most used channels by using specified audiences. Customer data is gathered through a system of trackers embedded in various areas of your website. @@ -29,14 +31,18 @@ Customer data is gathered through a system of trackers embedded in various areas ### Installation and configuration -To start using [[= product_name_cdp =]], first you need to contact your sales representative, who provides you with a link to [register your [[= product_name_cdp =]] account](https://doc.ibexa.co/en/latest/cdp/cdp_installation/#register-in-ibexa-cdp-dashboard). When you're done with registration process, you'll be able to access a separate instance with the data needed to configure, activate, and use this feature. +To start using [[= product_name_cdp =]], first you need to contact your sales representative, who provides you with a link to [register your [[= product_name_cdp =]] account](https://doc.ibexa.co/en/latest/cdp/cdp_installation/#register-in-ibexa-cdp-dashboard). +When you're done with registration process, you're able to access a separate instance with the data needed to configure, activate, and use this feature. -After your account is created, you can [download and install the [[= product_name_cdp =]] package](https://doc.ibexa.co/en/latest/cdp/cdp_installation/#install-cdp-package) that is opt-in and needs to be downloaded separately. Last step is to go through the [configuration process](https://doc.ibexa.co/en/latest/cdp/cdp_activation/cdp_configuration/). +After your account is created, you can [download and install the [[= product_name_cdp =]] package](https://doc.ibexa.co/en/latest/cdp/cdp_installation/#install-cdp-package) that is opt-in and needs to be downloaded separately. +Last step is to go through the [configuration process](https://doc.ibexa.co/en/latest/cdp/cdp_activation/cdp_configuration/). ### Customer profile -In [[= product_name_cdp =]] you can build 360° customer profiles. It unifies customer data from different sources to help you understand your prospects and customer needs. -After you get customer data, you can unify and match customer profiles based on their preferences and habits. You can create and analyze complete, 360° customer profiles based on demographics, interactions, behaviors, and transactional data. +In [[= product_name_cdp =]] you can build 360° customer profiles. +It unifies customer data from different sources to help you understand your prospects and customer needs. +After you get customer data, you can unify and match customer profiles based on their preferences and habits. +You can create and analyze complete, 360° customer profiles based on demographics, interactions, behaviors, and transactional data. This approach helps you create a single customer view. ![Customer profile](img/customer_profile.png) @@ -47,7 +53,8 @@ To create a personalized customer experience, you need to group your clients int [[= product_name =]] comes with a ready solution - segment groups. Segment group information is reused by various [[= product_name =]] functionalities, such as [Personalization](personalization_guide.md) or content targeting. -You can [create a segment group](https://doc.ibexa.co/projects/userguide/en/latest/personalization/segment_management/) in the back office of [[= product_name =]]. It serves as a container for all segments data generated by [[= product_name_cdp =]]. +You can [create a segment group](https://doc.ibexa.co/projects/userguide/en/latest/personalization/segment_management/) in the back office of [[= product_name =]]. +It serves as a container for all segments data generated by [[= product_name_cdp =]]. When you create a segment group, you need to provide its name and identifier. Be careful while doing so, as after you create the segment group in the back office and connect it to [[= product_name_cdp =]], you cannot change it in any way, including edit its name. @@ -57,14 +64,16 @@ Remember to add a segment group identifier to the configuration, under the `segm ### Data export -Configuration in [[= product_name_cdp =]] allows you to automate the process of exporting Content, Users, and Products. -An `ibexa_cdp.data_export` [configuration key](https://doc.ibexa.co/en/latest/cdp/cdp_data_export_schedule/#configuration-key) includes the `schedule` setting where you can find separate sections for exporting User, Content, and Product. Structure of each section is exactly the same and includes `interval` and `options` elements: +Configuration in [[= product_name_cdp =]] allows you to automate the process of exporting content, users, and products. +An `ibexa_cdp.data_export` [configuration key](https://doc.ibexa.co/en/latest/cdp/cdp_data_export_schedule/#configuration-key) includes the `schedule` setting where you can find separate sections for exporting user, content, and product. +Structure of each section is exactly the same and includes `interval` and `options` elements: -- `interval` - sets the frequency of the command invoke using cron expressions, for example, '*/30 * * * *' means "every 30 minutes", '0 */12 * * *' means "every 12th hour". +- `interval` - sets the frequency of the command invoke using cron expressions, for example, '*/30 * * * *' means "every 30 minutes", '0 */12 * * *' means "every 12th hour" -- `options` - allows you to add arguments that have to be passed to the export command. +- `options` - allows you to add arguments that have to be passed to the export command -This configuration allows you to provide multiple export workflows with parameters. It's important, because all the types of content/product must have their own parameters on the CDP side, where each has a different Stream ID key and different required values configured per data source. +This configuration allows you to provide multiple export workflows with parameters. +It's important, because all the types of content/product must have their own parameters on the CDP side, where each has a different Stream ID key and different required values configured per data source. Regarding data export, currently, only Stream File transport is supported and can be initialized from the configuration. @@ -72,8 +81,9 @@ For more information, see [CDP data export](https://doc.ibexa.co/en/latest/cdp/c ### Data customization -​You can customize Content and Product data exported to [[= product_name_cdp =]] and control what field type information you want to export. -With [[= product_name_cdp =]], you can export field types and field type values. they're exported with metadata and attributes, for example, ID, Field Definition name, type, value. +​You can customize content and product data exported to [[= product_name_cdp =]] and control what field type information you want to export. +With [[= product_name_cdp =]], you can export field types and field type values. +They're exported with metadata and attributes, for example, ID, Field Definition name, type, or value. For more information, see [data customization](https://doc.ibexa.co/en/latest/cdp/cdp_data_customization/#data-customization) documentation in Developer Documentation. @@ -86,7 +96,8 @@ For more information, see [CDP add client-side tracking](https://doc.ibexa.co/en In the Audience Builder, you can create audiences - groups of users that meet the assumed conditions. You can choose specific conditions: `did`, `did not`, or `have`. -The conditions `did` and `did not` allow you to use events like buy, visit or add to a cart from online tracking. The `have` conditions are tied to personal characteristics and can be used to track the sum of all buys or top-visited categories. +The conditions `did` and `did not` allow you to use events like buy, visit or add to a cart from online tracking. +The `have` conditions are tied to personal characteristics and can be used to track the sum of all buys or top-visited categories. You can also connect created audiences to the activations. @@ -111,7 +122,8 @@ Create user groups - audiences - based on conditions and events. ### Data export -Export data regarding Content, Users, and Products. Data export includes automatic file mapping. +Export data regarding content, users, and products. +Data export includes automatic file mapping. Analyze customer data, track campaigns, and discover the most effective strategies to boost performance. ### Data customization diff --git a/docs/cdp/cdp_installation.md b/docs/cdp/cdp_installation.md index e5c1923588..3b34652a83 100644 --- a/docs/cdp/cdp_installation.md +++ b/docs/cdp/cdp_installation.md @@ -6,14 +6,12 @@ edition: experience # Ibexa CDP installation There are three steps required to install [[= product_name_cdp =]]. -First, you need to register your [[= product_name_cdp =]] account, then you can download a CDP package and update the configuration. +First, you need to register your [[= product_name_cdp =]] account, then you can download a CDP package and update the configuration. ## Register in Ibexa CDP dashboard -If you decide to acquire [[= product_name_cdp =]] contact your sales representative, -they provide you with a registration link to [[= product_name_cdp =]]. -After registration, you get access to a separate instance -where you can find data required for configuring, activating and using this feature. +If you decide to acquire [[= product_name_cdp =]] contact your sales representative, they provide you with a registration link to [[= product_name_cdp =]]. +After registration, you get access to a separate instance where you can find data required for configuring, activating, and using this feature. ## Install CDP package @@ -26,8 +24,7 @@ composer require ibexa/cdp ``` Flex installs and activate the package. -After an installation process is finished, go to `config/packages/security.yaml` -and uncomment `ibexa_cdp` rule. +After an installation process is finished, go to `config/packages/security.yaml` and uncomment `ibexa_cdp` rule. ```yaml ibexa_cdp: diff --git a/docs/commerce/cart/cart.md b/docs/commerce/cart/cart.md index a744429c27..6d08175bca 100644 --- a/docs/commerce/cart/cart.md +++ b/docs/commerce/cart/cart.md @@ -5,10 +5,8 @@ edition: commerce # Cart -The cart component is a foundation of the Commerce offering delivered as part -of [[= product_name =]]. -It covers actions related to the creation and handling of a list of products -that the buyer intends to purchase. +The cart component is a foundation of the Commerce offering delivered as part of [[= product_name_com =]]. +It covers actions related to the creation and handling of a list of products that the buyer intends to purchase. The component exposes the following: @@ -27,42 +25,34 @@ Cart constructor takes the following arguments: ## Cart data handling -Cart data is handled by two storages, depending on whether the buyer is anonymous -or has been authenticated. -Information that relates to anonymous users is stored in the PHP session, while -registered user data is stored in a database. +Cart data is handled by two storages, depending on whether the buyer is anonymous or has been authenticated. +Information that relates to anonymous users is stored in the PHP session, while registered user data is stored in a database. -By default, anonymous users can add items to cart, but to display the cart view, -they have to log in and transition into an authenticated user. +By default, anonymous users can add items to cart, but to display the cart view, they have to log in and transition into an authenticated user. !!! note - For information about roles and permissions that control access to the cart, - see [Permission use cases](permission_use_cases.md#commerce). + For information about roles and permissions that control access to the cart, see [Permission use cases](permission_use_cases.md#commerce). ### Cart data merging -When a buyer browses the storefront anonymously and fills the cart with items, -anonymous cart data is stored in the PHP session storage. -Then, when an anonymous user logs into the storefront, cart data from the PHP session -storage is persisted and merged with any cart information that might already exist in the database for this authenticated user. +When a buyer browses the storefront anonymously and fills the cart with items, anonymous cart data is stored in the PHP session storage. +Then, when an anonymous user logs into the storefront, cart data from the PHP session storage is persisted and merged with any cart information that might already exist in the database for this authenticated user. If no previous cart data exists, a new cart is created. ### Cart data validation -When a buyer tries to add products to the cart, increase cart item quantity or proceed to checkout, the cart component performs cart item validation and checks whether: +When a buyer tries to add products to the cart, increase cart item quantity, or proceed to checkout, the cart component performs cart item validation and checks whether: -- the product is available -- the requested quantity of product is available -- the product is available at a price in the currency selected for the cart +- the product is available +- the requested quantity of product is available +- the product is available at a price in the currency selected for the cart ## Front-end perspective -From the front-end perspective, the cart consists of a main `Cart` object -and several widgets. -`Cart` is a standalone JavaScript object that manages cart data and has no user interface, -while widgets consist of JavaScript code and accompanying Twig templates. +From the front-end perspective, the cart consists of a main `Cart` object and several widgets. +`Cart` is a standalone JavaScript object that manages cart data and has no user interface, while widgets consist of JavaScript code and accompanying Twig templates. ### Cart service object @@ -85,10 +75,9 @@ document.body.addEventListener( ); ``` -### Cart service +### Cart service -The Cart package provides `Ibexa\Contracts\Cart\CartServiceInterface` Symfony service, -which is the entrypoint for calling the [backend API](cart_api.md). +The Cart package provides `Ibexa\Contracts\Cart\CartServiceInterface` Symfony service, which is the entrypoint for calling the [backend API](cart_api.md). You can import the service using the following code: diff --git a/docs/commerce/cart/cart_api.md b/docs/commerce/cart/cart_api.md index a849759cd6..575d0246e2 100644 --- a/docs/commerce/cart/cart_api.md +++ b/docs/commerce/cart/cart_api.md @@ -40,8 +40,7 @@ It follows the same search Query pattern as other APIs: ## Create cart -To create a cart, use the `CartServiceInterface::createCart` method and provide -it with `Ibexa\Contracts\Cart\Value\CartCreateStruct` that contains metadata (name, currency, owner): +To create a cart, use the `CartServiceInterface::createCart` method and provide it with `Ibexa\Contracts\Cart\Value\CartCreateStruct` that contains metadata (name, currency, owner): ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 8, 9) =]] @@ -53,8 +52,7 @@ it with `Ibexa\Contracts\Cart\Value\CartCreateStruct` that contains metadata (na ## Update cart metadata You can update cart metadata after the cart is created. -You could do it to support a scenario when, for example, the user changes a currency -and the cart should recalculate all item prices to a new currency. +You could do it to support a scenario when, for example, the user changes a currency and the cart should recalculate all item prices to a new currency. To update cart metadata, use the `CartServiceInterface::updateCartMetadata` method: ``` php @@ -79,8 +77,7 @@ $cart = $cartService->updateCartMetadata($cart, $updateMetadataStruct); ## Delete cart -To delete a cart permanently, use the `CartServiceInterface::deleteCart` method -and pass the `CartInterface` object: +To delete a cart permanently, use the `CartServiceInterface::deleteCart` method and pass the `CartInterface` object: ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 88, 89) =]] @@ -89,8 +86,7 @@ and pass the `CartInterface` object: ## Empty cart -To remove all products from the cart in a single operation, use the -`CartServiceInterface::emptyCart` method: +To remove all products from the cart in a single operation, use the `CartServiceInterface::emptyCart` method: ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 88, 89) =]] @@ -99,12 +95,10 @@ To remove all products from the cart in a single operation, use the ## Check cart validity -Items in cart can become invalid, for example, when item price is unavailable -in cart currency, or the product is no longer available. +Items in cart can become invalid, for example, when item price is unavailable in cart currency, or the product is no longer available. To prevent checking out a cart with invalid items, check cart validity first. To validate the cart, use the `CartServiceInterface::validateCart` method. -Validation is done with help from the `symfony/validator` component, and the method -returns a `Symfony\Component\Validator\ConstraintViolationListInterface` object. +Validation is done with help from the `symfony/validator` component, and the method returns a `Symfony\Component\Validator\ConstraintViolationListInterface` object. ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 88, 89) =]] @@ -113,8 +107,7 @@ returns a `Symfony\Component\Validator\ConstraintViolationListInterface` object. ## Add entry to cart -To add entries (products) to the cart, create an `Ibexa\Contracts\Cart\Value\EntryAddStruct`, -where you specify the requested quantity of the product. +To add entries (products) to the cart, create an `Ibexa\Contracts\Cart\Value\EntryAddStruct`, where you specify the requested quantity of the product. Then pass it to the `CartServiceInterface::addEntry` method: ``` php @@ -140,8 +133,7 @@ To remove an entry from the cart, use the `CartServiceInterface::removeEntry` me ## Update entry metadata Entries have their own metadata, for example, quantity. -To change entry metadata, use the `CartServiceInterface::updateEntry` method -and provide it with `Ibexa\Contracts\Cart\Value\EntryUpdateStruct`. +To change entry metadata, use the `CartServiceInterface::updateEntry` method and provide it with `Ibexa\Contracts\Cart\Value\EntryUpdateStruct`. ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 12, 13) =]] @@ -170,9 +162,8 @@ $createStruct->setContext(new ArrayMap([ $cart = $cartService->createCart($createStruct); ``` -In the above example, you create a cart using the `CartCreateStruct`, -and set the context data using the `setContext` method. -You've also added "X1MF7699" coupon code as context data to the cart. +In the above example, you create a cart using the `CartCreateStruct`, and set the context data using the `setContext` method. +You also add "X1MF7699" coupon code as context data to the cart. ### Adding context data to cart entry @@ -189,11 +180,11 @@ $entryAddStruct->setContext(new ArrayMap([ In the above example, you create a cart entry using the `EntryAddStruct`. The `setContext` method allows you to attach context data to the cart entry. -In this case, you've attached a "tshirt_text" attribute to the cart entry, which might represent custom text for a T-shirt. +In this case, you attach a "tshirt_text" attribute to the cart entry, which might represent custom text for a T-shirt. ## Merge carts -To combine the contents of multiple shopping carts into a target cart, use the `CartServiceInterface::mergeCarts` method. +To combine the contents of multiple shopping carts into a target cart, use the `CartServiceInterface::mergeCarts` method. This operation is helpful when you want to consolidate items from a reorder cart and a current cart into a single order. ```php diff --git a/docs/commerce/cart/quick_order.md b/docs/commerce/cart/quick_order.md index d2660f1d2a..ec1b5ae68d 100644 --- a/docs/commerce/cart/quick_order.md +++ b/docs/commerce/cart/quick_order.md @@ -19,7 +19,7 @@ Customers can use one or both of the following methods to specify products and p 2\. Provides products' SKU and quantity. At this point, no validation is provided. -![Customer enters individual products](img/quick_order_list.png) +![Customer enters individual products](img/quick_order_list.png) 3\. Customer clicks **Add to cart** to add items to the cart and finish an ordering process. @@ -31,7 +31,7 @@ Customers can use one or both of the following methods to specify products and p 2\. Downloads a sample file from **Add your order** section. -3\. Uses the template to fill in their order with products' SKU and quantity. +3\. Uses the template to fill in their order with products' SKU and quantity. 4\. Uploads the filled in quick order file back to the system by drag and drop or file selection. @@ -39,7 +39,7 @@ Customers can use one or both of the following methods to specify products and p ![Customer uploads list of products](img/quick_order_add_order.png) -6\. Customer clicks **Add to cart** to add items to the cart and finish an ordering process. +6\. Customer clicks **Add to cart** to add items to the cart and finish an ordering process. 7\. In the cart section, the file format and provided data are validated, the availability of the entered product is checked, and the customer is informed if any of them is unavailable or quantity is insufficient. diff --git a/docs/commerce/checkout/checkout.md b/docs/commerce/checkout/checkout.md index bf2c21d652..9b51c09105 100644 --- a/docs/commerce/checkout/checkout.md +++ b/docs/commerce/checkout/checkout.md @@ -5,18 +5,14 @@ edition: commerce # Checkout -Checkout is a crucial component of the Commerce offering delivered as part -of [[= product_name =]]. -In a course of a multi-step process, it collects necessary transaction data, such -as billing and shipping addresses, and payment and shipping information. +Checkout is a crucial component of the Commerce offering delivered as part of [[= product_name_com =]]. +In a course of a multi-step process, it collects necessary transaction data, such as billing and shipping addresses, and payment and shipping information. -From the front-end perspective, it's a reusable component that provides access -to the workflow and allows buyers to place an order for cart items. +From the front-end perspective, it's a reusable component that provides access to the workflow and allows buyers to place an order for cart items. ![Address selection stage](checkout.png "Checkout stages") -Depending on the model of shopping process that you need to use, the checkout -process can range between a straightforward and extremely complicated one. +Depending on the model of shopping process that you need to use, the checkout process can range between a straightforward and extremely complicated one. To allow for this variation, the component is highly configurable and extensible: - Like the editorial workflow, it relies on [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html) @@ -24,23 +20,17 @@ To allow for this variation, the component is highly configurable and extensible - It exposes Twig functions used for checkout rendering In a default implementation, users go through a series of steps. -They first select a billing and shipping address, then select shipping and payment -methods, later they review summary and confirm their choices, to finally receive -a simulated order confirmation. +They first select a billing and shipping address, then select shipping and payment methods, later they review summary and confirm their choices, to finally receive a simulated order confirmation. -Until the checkout process is complete, at any point of the process, users can -go back to the cart and modify cart information, for example, cart item quantities. -They can also navigate back and forth between checkout steps, with an exception -of the "Checkout complete" step, which always ends the process. +Until the checkout process is complete, at any point of the process, users can go back to the cart and modify cart information, for example, cart item quantities. +They can also navigate back and forth between checkout steps, with an exception of the "Checkout complete" step, which always ends the process. You can modify these steps according to your needs. For more information, see [Configure checkout](configure_checkout.md). -## Shipping and billing address assignment logic +## Shipping and billing address assignment logic -As far as shipping details are concerned, checkout can behave differently, depending -on whether the buyer is a corporate account member, a registered customer, or -an individual. +As far as shipping details are concerned, checkout can behave differently, depending on whether the buyer is a corporate account member, a registered customer, or an individual. - Corporate account members can see a company's billing address, and several shipping addresses to pick from, as predefined in the company profile. - Registered customers are able see and modify the addresses that they defined at registration @@ -50,19 +40,19 @@ For more information about shipping and billing addresses, see [Configure checko ## Virtual Products checkout -Virtual product is a special type of a [product](products.md). Virtual products are non-tangible items such as memberships, services, warranties. +Virtual product is a special type of a [product](products.md). Virtual products are non-tangible items such as memberships, services, warranties. They can be sold individually, or as part of a product bundle. Virtual products don’t require shipment when they're purchased individually. -While purchasing virtual product, you only have to fill in the billing address and select relevant payment method. +While purchasing virtual product, you only have to fill in the billing address and select relevant payment method. ![`Virtual product purchasing`](virtual_product_purchase.png "Virtual product purchasing") ## Reorder Reorder functions as the variant for the checkout workflow and is accessible solely to logged-in users. -It initiates from the user's order history, where they can click **Reorder** and trigger the flow. -Next, the user is moved to cart where the system validates the order against existing stock. +It initiates from the user's order history, where they can click **Reorder** and trigger the flow. +Next, the user is moved to cart where the system validates the order against existing stock. If everything is available, customer can move to payment and summary. The system pre-fills address, shipping method, and payment details using information from the past order. diff --git a/docs/commerce/checkout/checkout_api.md b/docs/commerce/checkout/checkout_api.md index 0e7874f819..3393fd2c82 100644 --- a/docs/commerce/checkout/checkout_api.md +++ b/docs/commerce/checkout/checkout_api.md @@ -8,15 +8,12 @@ edition: commerce To get checkouts and manage them, use the `Ibexa\Contracts\Checkout\CheckoutServiceInterface` interface. With `CheckoutServiceInterface`, you manipulate checkouts that are stored in sessions. -Checkouts are containers for the `Ibexa\Contracts\Cart\Value\CartInterface` object -and all the data provided at each step of the [configurable checkout process](configure_checkout.md). +Checkouts are containers for the `Ibexa\Contracts\Cart\Value\CartInterface` object and all the data provided at each step of the [configurable checkout process](configure_checkout.md). The checkout process relies on Symfony Workflow, and you can customize each of its steps. -Each checkout step has its own controller that allows adding forms and external API calls -that process data and pass them to `CheckoutService`. +Each checkout step has its own controller that allows adding forms and external API calls that process data and pass them to `CheckoutService`. Completing a step results in submitting a form and updating the current checkout object. -At this point Symfony Workflow advances, the next controller takes over, and the -whole process continues. +At this point Symfony Workflow advances, the next controller takes over, and the whole process continues. From the developer's perspective, checkouts are referenced with an UUID identifier. @@ -31,8 +28,7 @@ To access a single checkout, use the `CheckoutServiceInterface::getCheckout` met ## Get single checkout for specific cart To fetch checkout for a cart that already exists, use the `CheckoutServiceInterface::getCheckoutForCart` method. -It can be useful when you want to initiate the checkout process right after -products are successfully added to a cart. +You can use it when you want to initiate the checkout process right after products are successfully added to a cart. ``` php [[= include_file('code_samples/api/commerce/src/Controller/CustomCheckoutController.php', 26, 30) =]] @@ -40,8 +36,7 @@ products are successfully added to a cart. ## Create checkout -To create a checkout, use the `CheckoutServiceInterface::createCheckout` method and -provide it with a `CheckoutCreateStruct` struct that contains a `CartInterface` object. +To create a checkout, use the `CheckoutServiceInterface::createCheckout` method and provide it with a `CheckoutCreateStruct` struct that contains a `CartInterface` object. ``` php [[= include_file('code_samples/api/commerce/src/Controller/CustomCheckoutController.php', 35, 41) =]] @@ -50,8 +45,8 @@ provide it with a `CheckoutCreateStruct` struct that contains a `CartInterface` ## Update checkout You can update the collected data after the checkout is created. -The data is stored within the `CheckoutInterface::context` object. -The last update time and status are also stored. +The data is stored within the `CheckoutInterface::context` object. +The last update time and status are also stored. To update the checkout, use the `CheckoutServiceInterface::updateCheckout` method and provide it with the `CheckoutUpdateStruct` struct that contains data collected at each step of the workflow, and a transition name to identify what step follows. diff --git a/docs/commerce/checkout/configure_checkout.md b/docs/commerce/checkout/configure_checkout.md index 0fb6dff33c..fb60c3c309 100644 --- a/docs/commerce/checkout/configure_checkout.md +++ b/docs/commerce/checkout/configure_checkout.md @@ -5,8 +5,7 @@ edition: commerce # Configure checkout -When you work with your Commerce implementation, you can review and modify -the checkout configuration. +When you work with your Commerce implementation, you can review and modify the checkout configuration. !!! note "Permissions" @@ -17,8 +16,7 @@ the checkout configuration. Checkout workflow relies on [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html). Each transition represents a separate checkout step. -By default, the checkout process is configured to render each step based on a separate -set of libraries and templates. +By default, the checkout process is configured to render each step based on a separate set of libraries and templates. Each checkout step is handled by a controller that you configure in workflow metadata. Custom workflow implementations are defined under the `framework.workflows` key, @@ -35,8 +33,10 @@ The system can then identify which of your configured workflows handles the chec Each step configuration includes the following settings: -- `controller` - A mandatory setting pointing to a library that governs the behavior of the process. The controller contains all the required business logic and submits the whole step, so that a transition can happen. -- `next_step` - An optional name of the next workflow transition. If not provided, the next workflow-enabled transition is processed. +- `controller` - A mandatory setting pointing to a library that governs the behavior of the process. +The controller contains all the required business logic and submits the whole step, so that a transition can happen. +- `next_step` - An optional name of the next workflow transition. +If not provided, the next workflow-enabled transition is processed. - `label` - An optional name of the step that can be displayed in the Twig helper. - `translation_domain` - A optional setting that defines the domain for a site with translated content. By default it's set to `checkout`. @@ -51,14 +51,12 @@ For more information, see [Work with shipping methods]([[= user_doc =]]/commerce ## Configure shipping and billing address field format -In your implementation, you may need to create custom format configurations -for the shipping or billing address fields, for example, to use different address -formats based on the buyer's geographical location. +In your implementation, you may need to create custom format configurations for the shipping or billing address fields, for example, to use different address formats based on the buyer's geographical location. Field formats for the billing and shipping addresses comply with the [FieldType Address](addressfield.md#formats) specification and can be controlled with the `billing_address_format` and `shipping_address_format` flags, respectively. They fall back to `billing` and `shipping` predefined formats by default: -- `billing` is part of the `ibexa/corporate-accounts` repository -- `shipping` is part of the `ibexa/checkout` bundle's default configuration +- `billing` is part of the `ibexa/corporate-accounts` repository +- `shipping` is part of the `ibexa/checkout` bundle's default configuration To modify address formats you create custom ones. \ No newline at end of file diff --git a/docs/commerce/checkout/customize_checkout.md b/docs/commerce/checkout/customize_checkout.md index 7768363048..bab5967f5d 100644 --- a/docs/commerce/checkout/customize_checkout.md +++ b/docs/commerce/checkout/customize_checkout.md @@ -5,8 +5,7 @@ edition: commerce # Customize checkout -When you work with your Commerce implementation, you can review and modify -the checkout configuration. +When you work with your Commerce implementation, you can review and modify the checkout configuration. Checkout is an essential component of the Commerce offering. It collects data that is necessary to create an order, including: @@ -17,11 +16,9 @@ It collects data that is necessary to create an order, including: It could also collect any other information that you find necessary. -Depending on your needs, the checkout process can be either complicated or very simple. -For example, if the website is selling airline tickets, you may need several [additional steps](#add-checkout-step) -with passengers defining their special needs. -On the other side of the spectrum would be a store that sells books with personal pickup, -where [one page checkout](#create-a-one-page-checkout) would be enough. +Depending on your needs, the checkout process can be either complicated or simple. +For example, if the website is selling airline tickets, you may need several [additional steps](#add-checkout-step) with passengers defining their special needs. +On the other side of the spectrum would be a store that sells books with personal pickup, where [one page checkout](#create-a-one-page-checkout) would be enough. There are several factors that make checkout particularly flexible and customizable: @@ -30,8 +27,7 @@ There are several factors that make checkout particularly flexible and customiza - it exposes Twig functions that help you render the steps The most important contract exposed by the package is the `CheckoutServiceInterface` interface. -It exposes a number of methods that you can call, for example, to load checkouts based -on checkout identifier or for a specific cart. +It exposes a number of methods that you can call, for example, to load checkouts based on checkout identifier or for a specific cart. Other methods help you create, update, or delete checkouts. For more information, see [Checkout API](checkout_api.md). @@ -39,8 +35,7 @@ For more information, see [Checkout API](checkout_api.md). ## Add checkout step By default, [[= product_name =]] comes with a multi-step checkout process, which you can expand by adding steps. -For example, if you were creating a project for selling theater tickets, you could add a step -that allows users to select their seats. +For example, if you were creating a project for selling theater tickets, you could add a step that allows users to select their seats. ### Define workflow @@ -69,8 +64,7 @@ In this case, you want users to select seats in the audience. In the `src/Controller/Checkout/Step` folder, create a file that resembles the following example. The controller contains a Symfony form that collects user selections. -It can reuse fields and functions that come from the checkout component, for example, -after you check whether the form is valid, use the `AbstractStepController::advance` method to go to the next step of the process. +It can reuse fields and functions that come from the checkout component, for example, after you check whether the form is valid, use the `AbstractStepController::advance` method to go to the next step of the process. ``` php hl_lines="23 24" [[= include_file('code_samples/front/shop/checkout/src/Controller/Checkout/Step/SelectSeatStepController.php') =]] @@ -283,14 +277,14 @@ To create custom Address field type formats to be used in checkout, make the fol First, define custom format configuration keys for `billing_address_format` and `shipping_address_format`: -``` yaml +``` yaml ibexa: repositories: : checkout: #"billing" by default billing_address_format: - #"shipping" by default + #"shipping" by default shipping_address_format: #used in registration, uses given shipping/billing addresses to pre-populate address forms in select_address checkout step, "customer" by default customer_content_type: @@ -298,7 +292,7 @@ ibexa: Then, define custom address formats, which, for example, do not include the `locality` field: -``` yaml +``` yaml ibexa_field_type_address: formats: : @@ -309,7 +303,7 @@ ibexa_field_type_address: - postal_code - email - phone_number - + : country: default: diff --git a/docs/commerce/checkout/reorder.md b/docs/commerce/checkout/reorder.md index 8a557fce59..9a03ec3d6a 100644 --- a/docs/commerce/checkout/reorder.md +++ b/docs/commerce/checkout/reorder.md @@ -73,7 +73,7 @@ Reorder comes with the dedicated `Ibexa\Contracts\Checkout\Reorder\ReorderServic It contains helper methods and facades added over existing API to ease the order manipulation process. The following methods can be used to modify the reorder flow to fit your business needs: -#### `ReorderService:addToCartFromOrder` +#### `ReorderService:addToCartFromOrder` Allows you to add items from a previous order to a cart. It uses historical data from previously ordered items even if they're no longer available. @@ -96,7 +96,7 @@ The method uses the following parameters: - `$sourceOrder` (OrderInterface) - the source order from which context is copied - `$targetCheckout` (CheckoutInterface) - the target checkout to which context is copied -#### `ReorderService:createReorderCart` +#### `ReorderService:createReorderCart` Creates a new shopping cart for reordering items from a past order in the same currency. The method uses the following parameters: diff --git a/docs/commerce/order_management/configure_order_management.md b/docs/commerce/order_management/configure_order_management.md index 5ea1d87c64..1909d304f0 100644 --- a/docs/commerce/order_management/configure_order_management.md +++ b/docs/commerce/order_management/configure_order_management.md @@ -7,18 +7,18 @@ edition: commerce When you work with your Commerce implementation, you can modify and customize the order processing configuration. -!!! note "Permissions" +!!! note "Permissions" When you modify the workflow configuration, make sure you properly set user [permissions](permission_use_cases.md#commerce) for the Order management component. ## Configure order processing workflow Order processing workflow relies on a [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html). -Each transition represents a separate order processing step. +Each transition represents a separate order processing step. ### Default order processing configuration -The default order processing workflow is called `ibexa_order`. +The default order processing workflow is called `ibexa_order`. To see the default workflow configuration, in your project directory, go to: `vendor/Ibexa/order-management/src/bundle/Resources/config/prepend.yaml`. The default workflow uses keys defined in `src/lib/Value/Status.php` file as place and transition names, for example, `PENDING_PLACE` translates into `pending`. @@ -27,8 +27,8 @@ You can replace the default workflow configuration with a custom one if needed. ### Custom order processing workflows -You define custom workflow implementations under the `framework.workflows` key. -If your installation supports multiple languages, for each place in the workflow, you can define a label that is pulled from a XLIFF file based on the [translation domain setting](back_office_translations.md). +You define custom workflow implementations under the `framework.workflows` key. +If your installation supports multiple languages, for each place in the workflow, you can define a label that is pulled from a XLIFF file based on the [translation domain setting](back_office_translations.md). You can also define colors that are used for status labels. To customize your configuration, place it under the `framework.workflows.` [configuration key](configuration.md#configuration-files): @@ -45,8 +45,7 @@ Then reference it with `ibexa.repositories..order_management.wo ### Define cancel order -You can define a status and transition in which the order can be canceled -by modifying workflow under the `framework.workflows` [configuration key](configuration.md#configuration-files). +You can define a status and transition in which the order can be canceled by modifying workflow under the `framework.workflows` [configuration key](configuration.md#configuration-files). ```yaml framework: @@ -61,5 +60,5 @@ framework: By default, the component integration mechanism reduces product stock values when an order is made (in status "pending") and reverts it to the original value when an order is cancelled. In your implementation, you may want the reduction/restoration of stock to happen at other stages of the order fulfillment process. -For this to happen, place the `reduce_stock: true` and/or `restore_stock: true` keys in other places of the workflow. +For this to happen, place the `reduce_stock: true` and/or `restore_stock: true` keys in other places of the workflow. Make sure that either of these keys is used only once. diff --git a/docs/commerce/order_management/order_management_api.md b/docs/commerce/order_management/order_management_api.md index 1323faf780..b8adf95bbd 100644 --- a/docs/commerce/order_management/order_management_api.md +++ b/docs/commerce/order_management/order_management_api.md @@ -11,7 +11,7 @@ edition: commerce To get orders and manage them, use the `Ibexa\Contracts\OrderManagement\OrderServiceInterface` interface. -## Get single order +## Get single order ### Get single order by identifier @@ -31,7 +31,7 @@ To access a single order by using its numerical ID, use the `OrderService::getOr ## Get multiple orders -To fetch multiple orders, use the `OrderService::findOrders` method. +To fetch multiple orders, use the `OrderService::findOrders` method. It follows the same search query pattern as other APIs: ``` php @@ -51,8 +51,8 @@ To create an order, use the `OrderService::createOrder` method and provide it wi ## Update order -You can update the order after it's created. -You could do it to support a scenario when, for example, the order is processed manually and its status has to be changed in the system. +You can update the order after it's created. +You could do it to support a scenario when, for example, the order is processed manually and its status has to be changed in the system. To update order information, use the `OrderService::updateOrder` method: ``` php diff --git a/docs/content_management/content_api/browsing_content.md b/docs/content_management/content_api/browsing_content.md index 8cdcadcf01..a02f1d52ff 100644 --- a/docs/content_management/content_api/browsing_content.md +++ b/docs/content_management/content_api/browsing_content.md @@ -143,7 +143,7 @@ of the ContentInfo object: !!! note - Note that requesting Section data may be impossible for an anonymous user. + Requesting Section data may be impossible for an anonymous user. Make sure to [authenticate](php_api.md#setting-the-repository-user) as a user with sufficient permissions. ### Object states diff --git a/docs/content_management/content_management_api/section_api.md b/docs/content_management/content_management_api/section_api.md index cf1baca9e2..853b8115cc 100644 --- a/docs/content_management/content_management_api/section_api.md +++ b/docs/content_management/content_management_api/section_api.md @@ -50,4 +50,4 @@ and the [`Section`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts- [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 64, 67) =]] ``` -Note that assigning a Section to content does not automatically assign it to the content item's children. +Assigning a Section to content does not automatically assign it to the content item's children. diff --git a/docs/content_management/content_management_guide.md b/docs/content_management/content_management_guide.md index 81944eb58f..454db47c16 100644 --- a/docs/content_management/content_management_guide.md +++ b/docs/content_management/content_management_guide.md @@ -8,9 +8,8 @@ description: Read the content management product guide and learn how to create, The term “content management” covers all the tasks that you need to perform to create, edit and present content to its intended audience. -The content management model applied in [[= product_name =]] lies at the foundation of the entire system. -A system that relies on roles and permissions controls access to content items and is granular and powerful enough to be used in managing user accounts, -corporate accounts, products, or process definitions. +The content management model applied in [[= product_name =]] lies at the foundation of the entire system. +A system that relies on roles and permissions controls access to content items and is granular and powerful enough to be used in managing user accounts, corporate accounts, products, or process definitions. ## Availability @@ -29,39 +28,36 @@ Content management capabilities are available in all [[= product_name =]] editio - media (images, videos, etc.) - user accounts -You can set up content structure, define the templates to be filled with content, and assign different areas of the structure to your editors. +You can set up content structure, define the templates to be filled with content, and assign different areas of the structure to your editors. Next steps would be to create the actual content, and then classify content items, and organize them as necessary. You can then publish the content directly, by building a website or a web store, or by using external systems together with a [headless CMS](https://developers.ibexa.co/headless-cms) that relies on the [[= product_name =]] technology. ## Content structure -All content in [[= product_name =]] is organized hierarchically, into what is called a [**content tree**](content_tree.md). +All content in [[= product_name =]] is organized hierarchically, into what is called a [**content tree**](content_tree.md). This tree-like structure repeats throughout the system, and applies to content, taxonomies, categories, and the like. -Traditional as the structure may look, with relations and multiple location support, -a single content item can be referenced by another content item and accessed from different places of the tree, -which allows you to build complex architectures with multiple locales and output channels. +Traditional as the structure may look, with relations and multiple location support, a single content item can be referenced by another content item and accessed from different places of the tree, which allows you to build complex architectures with multiple locales and output channels. ![Content structure in a Content Browser](img/content_tree.png) ## Content model -A structure of elements that *store* content information is referred to as the **content model**. +A structure of elements that *store* content information is referred to as the **content model**. [[= product_name =]] comes with a predefined content model that includes a broad set of various field types and several content types. -You can customize and adapt the content model to your organization's needs and the type of output channel that you use. -If need be, development teams can [create new field types](creating_a_point2d_field_type.md), to enhance editor and visitor experiences. -Content managers or even editors can then apply such field types when they modify existing or create new content types. +You can customize and adapt the content model to your organization's needs and the type of output channel that you use. +If need be, development teams can [create new field types](creating_a_point2d_field_type.md), to enhance editor and visitor experiences. +Content managers or even editors can then apply such field types when they modify existing or create new content types. The editing interface lets all users, including those with no coding experience, create or modify certain areas of the content model. For technical details, see [a Content model](content_model.md#content-model). ### Field types -[Field types](field_types.md) are the smallest elements of the content model’s structure. -[[= product_name =]] comes with many built-in field types that cover most common needs, -for example, Text line, RichText, Integer, Measurement, Map location, etc. +[Field types](field_types.md) are the smallest elements of the content model’s structure. +[[= product_name =]] comes with many built-in field types that cover most common needs, for example, Text line, RichText, Integer, Measurement, Map location, etc. Their role is to: @@ -78,39 +74,37 @@ For a complete list of available field types, see [field type reference](field_t Once you use a field type to design and build a content type definition, and define its settings, it becomes a Field. -Fields can be as simple as Name, based on a Text line field type, or as complex as Page, -based on a landing page field type, with multiple options to set and choose from: +Fields can be as simple as Name, based on a Text line field type, or as complex as Page, based on a landing page field type, with multiple options to set and choose from: ![Landing page field settings](img/fields.png) ### Content types -Life gets easier when you have templates to fill in with content. Content types are such templates, which editors use to create content items. +Life gets easier when you have templates to fill in with content. Content types are such templates, which editors use to create content items. Content types define what Fields are available in the content item. -[[= product_name =]] comes with several basic content types, and creating new ones, editing, -and deleting them is done by using a visual interface, with no coding skills needed. +[[= product_name =]] comes with several basic content types, and creating new ones, editing, and deleting them is done by using a visual interface, with no coding skills needed. ![Content types vs. content items](img/content_types.png) ### Content items -Content items are pieces of content, such as, for example, products, articles, blog posts, or media. +Content items are pieces of content, such as, for example, products, articles, blog posts, or media. In [[= product_name =]], everything is a content item — not just pages, articles or products, but also all media (images, videos, etc.) or even user accounts. -Each content item, apart from its name and identifier, contains a composition of Fields, which differs depending on the type of content. +Each content item, apart from its name and identifier, contains a composition of Fields, which differs depending on the type of content. For example, articles might have a title, an author, a body, and an image, while products may have a name, category, price, size, color, etc. ### Forms -Forms could be seen as a special kind of content items, because their role is to gather information from website users and not present it. -You create them from basic form fields available in [[= product_name =]]. +Forms could be seen as a special kind of content items, because their role is to gather information from website users and not present it. +You create them from basic form fields available in [[= product_name =]]. By adding forms to the website, you can increase the website’s functionality and improve user experience. Certain editions of [[= product_name =]] come with a visual [Form Builder]([[= user_doc =]]/content_management/work_with_forms/). ## Content management capabilities -Each content item has at least one location within the content tree, and can have several versions and multiple translations. +Each content item has at least one location within the content tree, and can have several versions and multiple translations. It can also have related assets, such as images or other media, and assigned keywords, or tags. You can use these characteristics in combination with system features to create the most comprehensive and functional digital presence for your organization. @@ -119,20 +113,20 @@ You can use these characteristics in combination with system features to create #### Locations -When a content item is created and published, it's assigned a place in the content tree, designated by a Location ID. -A single content item can have more than one Location ID, which means that the same content can be found on different branches of the tree. +When a content item is created and published, it's assigned a place in the content tree, designated by a Location ID. +A single content item can have more than one Location ID, which means that the same content can be found on different branches of the tree. However, a single location can have only one content item assigned to it. ![Locations](img/locations.png) Locations can be used to control the availability of content items to end users: -you can [hide specific locations]([[= user_doc =]]/content_management/content_organization/manage_locations_urls/#hide-locations) of a content item, while others remain available. +you can [hide specific locations]([[= user_doc =]]/content_management/content_organization/manage_locations_urls/#hide-locations) of a content item, while others remain available. By [swapping locations]([[= user_doc =]]/content_management/content_organization/manage_locations_urls/#swap-locations), you can immediately replace an obsolete version of a content item with an updated one. #### Versions -Content items can have several [versions]([[= user_doc =]]/content_management/content_versions/). -By default, there are three version statuses available: draft, published, and archived. +Content items can have several [versions]([[= user_doc =]]/content_management/content_versions/). +By default, there are three version statuses available: draft, published, and archived. Before they're published, drafts can be routed between different user roles for review and approval. ![Versions](img/versions.png) @@ -141,7 +135,7 @@ Editors can [compare different content item versions]([[= user_doc =]]/content_m #### Translations -Content items can have more than one [translation]([[= user_doc =]]/content_management/translate_content/). +Content items can have more than one [translation]([[= user_doc =]]/content_management/translate_content/). If a website has different fronts, for different locales, and different language versions of content exist, [[= product_name =]] serves the one that matches the locale. ![Translations](img/translations.png) @@ -175,17 +169,17 @@ There are multiple tools within [[= product_name =]] that help content managers ### Taxonomy -With taxonomy you can create tags or keywords within a tree structure and assign them to content items. +With taxonomy you can create tags or keywords within a tree structure and assign them to content items. This way you can classify content and make it easier for end users to find the content they need, or browse and view content from a category that suits them best. ![Taxonomy principles](img/taxonomy.png) ### Access control -When your [[= product_name =]] instance has multiple contributors and visitors, administrators can give them access to different areas of the website and different capabilities. +When your [[= product_name =]] instance has multiple contributors and visitors, administrators can give them access to different areas of the website and different capabilities. It's done by creating roles, with each role having a different set of [permissions](permission_overview.md), the most fitting example being the `content/edit` permission limited to an `Articles/BookReviews/Historical` subtree of the content tree. -In the next steps, after you create user groups, you’d assign roles to these groups, and add individual users to each of such groups. +In the next steps, after you create user groups, you’d assign roles to these groups, and add individual users to each of such groups. For more technical information about permissions and limitations, see [Permission use cases](permission_use_cases.md). There are, however, mechanisms to control access to content with even more convenience. @@ -193,26 +187,25 @@ There are, however, mechanisms to control access to content with even more conve ### Sections You can divide your content tree into nominal parts to better organize it. -Once you have defined sections, for example, Media or Forms, and assigned them to content items, -you can decide which roles have access to which Section of the tree. +Once you have defined sections, for example, Media or Forms, and assigned them to content items, you can decide which roles have access to which Section of the tree. -The setting is inherited, which means that a child content item inherits a value of this setting from its parent. +The setting is inherited, which means that a child content item inherits a value of this setting from its parent. Changing a Section setting does not result in moving a content item to a different location within a content tree. ![Members of the Media Section](img/sections.png) ### Object states -While reviewing the details of each individual content item in your content tree, you can assign a state to it, for example, “Locked” or “Not locked”. -Then you can set a permission that allows or denies users access to content items in a specific state. +While reviewing the details of each individual content item in your content tree, you can assign a state to it, for example, “Locked” or “Not locked”. +Then you can set a permission that allows or denies users access to content items in a specific state. This setting isn't inherited. ![Object states in content item’s Details](img/object_states.png) ### User segments -Although segments aren't meant to classify content, they could fall into this category, because their role is about targeting users, and not controlling their access to content. -With segments, you can reach specific groups, or categories, of visitors with specific information about content or products that could be of their interest. +Although segments aren't meant to classify content, they could fall into this category, because their role is about targeting users, and not controlling their access to content. +With segments, you can reach specific groups, or categories, of visitors with specific information about content or products that could be of their interest. For example, you can build Pages that contain different recommendations, depending on who is visiting them. ![A Segment Group with two user segments](img/user_segments.png) @@ -225,19 +218,18 @@ Since content management is an ongoing process, and, in your implementation, you **1\. Create a content model** -Any content that you might want to deliver to a viewer can be structured and split into smaller elements. +Any content that you might want to deliver to a viewer can be structured and split into smaller elements. Reverse-engineer the intended concepts into individual fields, which can be categorized, and then picked from categories and combined into content items. Reuse existing Fields Types or [customize them to fit your needs](create_custom_generic_field_type.md), then [create content types]([[= user_doc =]]/content_management/create_edit_content_items/). **2\. Define permissions** -Although this step isn't directly related to content management, -it's a good time to [set up user roles and permissions]([[= user_doc =]]/permission_management/work_with_permissions/), which users would need to work with content. +Although this step isn't directly related to content management, it's a good time to [set up user roles and permissions]([[= user_doc =]]/permission_management/work_with_permissions/), which users would need to work with content. **3\. Author content** -[Create various content items]([[= user_doc =]]/content_management/create_edit_content_items/), such as pages, articles, forms, or media. While you fill Fields with content, several actions are there to help you with your task. +[Create various content items]([[= user_doc =]]/content_management/create_edit_content_items/), such as pages, articles, forms, or media. While you fill Fields with content, several actions are there to help you with your task. You can pause and resume the work, preview the results, or send content for review. ![Send to review](img/send_to_review.png) @@ -248,7 +240,7 @@ Again, this isn't part of content management, but at this point you can [publish **5\. Organize content** -Organize the content of your website by copying or moving content items, [controlling Locations and URL addresses]([[= user_doc =]]/content_management/content_organization/manage_locations_urls/). +Organize the content of your website by copying or moving content items, [controlling Locations and URL addresses]([[= user_doc =]]/content_management/content_organization/manage_locations_urls/). Then work with Tags, Sections and Object States to [classify]([[= user_doc =]]/content_management/content_organization/classify_content/#sections) it. ## Benefits @@ -267,21 +259,15 @@ The most important benefits of using Content management capabilities of [[= prod ### Corporate website -The most common use case for a comprehensive content management system like [[= product_name =]] would be creating and maintaining a multinational company’s digital presence, -with both public and intranet channels, multiple websites with overlapping content structures, -and business partners and end-customers alike wanting to connect through different channels to access public and classified content. +The most common use case for a comprehensive content management system like [[= product_name =]] would be creating and maintaining a multinational company’s digital presence, with both public and intranet channels, multiple websites with overlapping content structures, and business partners and end-customers alike wanting to connect through different channels to access public and classified content. ### B2C web store Content management could lie at a foundation of a successful global web store, where customers connect through localized websites and branded mobile apps: -individual products can have multiple variants with differing related assets, -product descriptions must be available in multiple language versions, -and access to certain areas of the store depends on both a country and a segment that the customer comes from. +individual products can have multiple variants with differing related assets, product descriptions must be available in multiple language versions, and access to certain areas of the store depends on both a country and a segment that the customer comes from. ### B2B store -Extensive content management capabilities would prove themselves in a setting, -where multiple buyers from different partner companies connect to an industry leader’s trading website, -and they expect to find well organized SKU catalogs that contain basic product information. -From there they would like to access detailed specifications, white papers and application notes. +Extensive content management capabilities would prove themselves in a setting, where multiple buyers from different partner companies connect to an industry leader’s trading website, and they expect to find well organized SKU catalogs that contain basic product information. +From there they would like to access detailed specifications, white papers and application notes. The same products could come with different brands and at different price points, depending on the customer segment or origin. diff --git a/docs/content_management/field_types/field_type_reference/binaryfilefield.md b/docs/content_management/field_types/field_type_reference/binaryfilefield.md index c19d0cc9d6..f5cf63ee51 100644 --- a/docs/content_management/field_types/field_type_reference/binaryfilefield.md +++ b/docs/content_management/field_types/field_type_reference/binaryfilefield.md @@ -14,14 +14,14 @@ It's capable of handling virtually any file type and is typically used for stori #### Properties -Note that both `BinaryFile` and `Media` Value and Type inherit from the `BinaryBase` abstract field type, and share common properties. +Both `BinaryFile` and `Media` Value and Type inherit from the `BinaryBase` abstract field type, and share common properties. `Ibexa\Core\FieldType\BinaryFile\Value` offers the following properties: |Attribute|Type|Description|Example| |------|------|------|------| |`id`|string|Binary file identifier. This ID depends on the [IO Handler](clustering.md#dfs-io-handler) that is being used. With the native, default handlers (FileSystem and Legacy), the ID is the file path, relative to the binary file storage root dir (`var//storage/original` by default).|application/63cd472dd7.pdf| -|`fileName`|string|The human-readable file name, as exposed to the outside. Used when sending the file for download in order to name the file.|20130116_whitepaper.pdf| +|`fileName`|string|The human-readable file name, as exposed to the outside. Used when sending the file for download to name the file.|20130116_whitepaper.pdf| |`fileSize`|int|File size, in bytes.|1077923| |`mimeType`|string|The file's MIME type.|application/pdf| |`uri`|string|The binary file's `content/download` URI. If the URI doesn't include a host or protocol, it applies to the request domain.|/content/download/210/2707| diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index 6b2b20a569..f3b39bb947 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -181,7 +181,7 @@ $createStruct = $contentService->newContentCreateStruct( $createStruct->setField( 'image', '/tmp/image.png' ); ``` -In order to customize the Image's alternative texts, you must first get an `Image\Value` object, and set this property. For that, you can use the `Image\Value::fromString()` method that accepts the path to a local file: +To customize the Image's alternative texts, you must first get an `Image\Value` object, and set this property. For that, you can use the `Image\Value::fromString()` method that accepts the path to a local file: ``` php $createStruct = $contentService->newContentCreateStruct( diff --git a/docs/content_management/field_types/field_type_reference/mediafield.md b/docs/content_management/field_types/field_type_reference/mediafield.md index a37d738a1e..0fc60a416a 100644 --- a/docs/content_management/field_types/field_type_reference/mediafield.md +++ b/docs/content_management/field_types/field_type_reference/mediafield.md @@ -31,7 +31,7 @@ It's capable of handling the following types of files: `Ibexa\Core\FieldType\Media\Value` offers the following properties. -Note that both `Media` and `BinaryFile` Value and Type inherit from the `BinaryBase` abstract field type and share common properties. +Both `Media` and `BinaryFile` Value and Type inherit from the `BinaryBase` abstract field type and share common properties. |Property|Type|Description|Example| |------|------|------|------| diff --git a/docs/content_management/field_types/field_type_reference/pagefield.md b/docs/content_management/field_types/field_type_reference/pagefield.md index c771074bdb..31e0874a07 100644 --- a/docs/content_management/field_types/field_type_reference/pagefield.md +++ b/docs/content_management/field_types/field_type_reference/pagefield.md @@ -22,7 +22,7 @@ Page field type is only used in the Page content type that is included in [[= pr Layout defines how a Page is divided into zones. -The placement of zones is defined in a template which is a part of the layout configuration. You can modify the template in order to define your own zone layout. +The placement of zones is defined in a template which is a part of the layout configuration. You can modify the template to define your own zone layout. For information on how to create and configure new blocks for the Page, see [Page layouts](render_page.md#render-a-layout). diff --git a/docs/content_management/field_types/field_type_reference/richtextfield.md b/docs/content_management/field_types/field_type_reference/richtextfield.md index 9f1bb9d763..7ea222dd52 100644 --- a/docs/content_management/field_types/field_type_reference/richtextfield.md +++ b/docs/content_management/field_types/field_type_reference/richtextfield.md @@ -8,7 +8,7 @@ This field type validates and stores structured rich text, and exposes it in sev |------|------|------| |`RichText`|`ezrichtext`|mixed| -## PHP API field type +## PHP API field type ### Value object diff --git a/docs/content_management/field_types/field_type_search.md b/docs/content_management/field_types/field_type_search.md index 6090ed9ab8..6dc4f804b1 100644 --- a/docs/content_management/field_types/field_type_search.md +++ b/docs/content_management/field_types/field_type_search.md @@ -47,7 +47,7 @@ Ibexa\Core\FieldType\Keyword\SearchField: - {name: ibexa.field_type.indexable, alias: ezkeyword} ``` -Note that `alias` should be the same as field type ID. +`alias` should be the same as field type ID. ## Search Field values diff --git a/docs/content_management/field_types/field_type_storage.md b/docs/content_management/field_types/field_type_storage.md index 0e2a65e390..507352bfe4 100644 --- a/docs/content_management/field_types/field_type_storage.md +++ b/docs/content_management/field_types/field_type_storage.md @@ -91,7 +91,7 @@ A field type may store arbitrary data in external data sources. External storage can be e.g. a web service, a file in the file system, another database or even the [[= product_name =]] database itself (in form of a non-standard table). -In order to store data in external storage, the field type interacts with the Persistence SPI +To store data in external storage, the field type interacts with the Persistence SPI through the `Ibexa\Contracts\Core\FieldType\FieldStorage` interface. Accessing the internal storage of a content item that includes a Field of the field type @@ -101,7 +101,7 @@ calls one of the following methods to also access the external data: |------|-----------| |`hasFieldData()`|Returns whether the field type stores external data at all.| |`storeFieldData()`|Called right before a Field of the field type is stored. The method stores `$externalData`. It returns `true` if the call manipulated internal data of the given Field, so that it's updated in the internal database.| -|`getFieldData()`|Called after a Field has been restored from the database in order to restore `$externalData`.| +|`getFieldData()`|Called after a Field has been restored from the database to restore `$externalData`.| |`deleteFieldData()`|Must delete external data for the given Field, if exists.| |`getIndexData()`|Returns the actual index data for the provided `Ibexa\Contracts\Core\Persistence\Content\Field`. For more information, see [search service](field_type_search.md#search-field-values).| @@ -110,19 +110,19 @@ To retrieve and store data in the [[= product_name =]] data storage, but outside of the normal structures (e.g. a custom table in an SQL database), use [Gateway-based storage](#gateway-based-storage) with properly injected Doctrine Connection. -Note that the field type must take care on its own for being compliant with different data sources and that third parties can extend the data source support easily. +The field type must take care on its own for being compliant with different data sources and that third parties can extend the data source support easily. ### Gateway-based storage -In order to allow the usage of a field type that uses external data with different data storages, it's recommended to implement a gateway infrastructure and a registry for the gateways. To make this easier, the Core implementation of field types provides corresponding interfaces and base classes. They can also be used for custom field types. +To allow the usage of a field type that uses external data with different data storages, it's recommended to implement a gateway infrastructure and a registry for the gateways. To make this easier, the Core implementation of field types provides corresponding interfaces and base classes. They can also be used for custom field types. -The interface `Ibexa\Contracts\Core\FieldType\StorageGateway` is implemented by gateways, in order to be handled correctly by the registry. It has one method: +The interface `Ibexa\Contracts\Core\FieldType\StorageGateway` is implemented by gateways, to be handled correctly by the registry. It has one method: |Method|Description| |------|-----------| |`setConnection()`|The registry mechanism uses this method to set the SPI storage connection (e.g. the database connection to the Legacy Storage database) into the gateway, which might be used to store external data. The connection is retrieved from the `$context` array automatically by the registry.| -Note that the Gateway implementation itself must take care of validating that it received a usable connection. If it does not, it should throw a `RuntimeException`. +The Gateway implementation itself must take care of validating that it received a usable connection. If it does not, it should throw a `RuntimeException`. The registry mechanism is realized as a base class for `FieldStorage` implementations: `Ibexa\Core\FieldType\GatewayBasedStorage`. For managing `StorageGateway`s, the following methods are already implemented in the base class: @@ -170,10 +170,10 @@ services: App\FieldType\MyField\Storage\Gateway\DoctrineStorage: ~ ``` -Note that `ibexa.api.storage_engine.legacy.connection` is of type `Doctrine\DBAL\Connection`. If your gateway still uses an implementation of `eZ\Publish\Core\Persistence\Database\DatabaseHandler` (`eZ\Publish\Core\Persistence\Doctrine\ConnectionHandler`), instead of the `ibexa.api.storage_engine.legacy.connection`, you can pass the `ibexa.api.storage_engine.legacy.dbhandler` service. +`ibexa.api.storage_engine.legacy.connection` is of type `Doctrine\DBAL\Connection`. If your gateway still uses an implementation of `eZ\Publish\Core\Persistence\Database\DatabaseHandler` (`eZ\Publish\Core\Persistence\Doctrine\ConnectionHandler`), instead of the `ibexa.api.storage_engine.legacy.connection`, you can pass the `ibexa.api.storage_engine.legacy.dbhandler` service. -Also note that there can be several gateways per field type (one per storage engine). In this case it's recommended to either create base implementation which each gateway can inherit or create interface which each gateway must implement and reference it instead of specific implementation when type-hinting method arguments. +Also there can be several gateways per field type (one per storage engine). In this case it's recommended to either create base implementation which each gateway can inherit or create interface which each gateway must implement and reference it instead of specific implementation when type-hinting method arguments. !!! tip diff --git a/docs/content_management/field_types/field_types.md b/docs/content_management/field_types/field_types.md index 412b1979a1..e8bd92c6cf 100644 --- a/docs/content_management/field_types/field_types.md +++ b/docs/content_management/field_types/field_types.md @@ -27,7 +27,7 @@ available in the [`Ibexa\Core\FieldType`](https://github.com/ibexa/core/tree/mai Remember that all your custom field types must be registered in `config/services.yml`. For more information see [Registration](type_and_value.md#registration). -In order to provide custom functionality for a field type, the SPI interacts with multiple layers of the [[= product_name =]] architecture: +To provide custom functionality for a field type, the SPI interacts with multiple layers of the [[= product_name =]] architecture: ![Field type Overview](field_type_overview.png) @@ -41,10 +41,8 @@ Below that, the field type must support the **public PHP API** implementation re - Value creation and validation - Communication with the Persistence SPI -On the bottom level, a field type can additionally hook into the **Persistence SPI** -in order to store data from a `FieldValue` in an external service. -Note that all non-standard [[= product_name =]] database tables (e.g. `ezurl`) -are treated as [external storage](field_type_storage.md#storing-data-externally). +On the bottom level, a field type can additionally hook into the **Persistence SPI** to store data from a `FieldValue` in an external service. +All non-standard [[= product_name =]] database tables (e.g. `ezurl`) are treated as [external storage](field_type_storage.md#storing-data-externally). The following sequence diagrams visualize the process of creating and publishing new content across all layers, especially focused on the interaction with a field type. diff --git a/docs/content_management/pages/page_block_attributes.md b/docs/content_management/pages/page_block_attributes.md index d2a3e9dac0..426ae901ca 100644 --- a/docs/content_management/pages/page_block_attributes.md +++ b/docs/content_management/pages/page_block_attributes.md @@ -73,7 +73,7 @@ To define the type, create a `src/Block/Attribute/MyStringAttributeType.php` fil [[= include_file('code_samples/page/custom_attribute/src/Block/Attribute/MyStringAttributeType.php') =]] ``` -Note that the attribute uses `AbstractType` (line 5) and `TextType` (line 6). +The attribute uses `AbstractType` (line 5) and `TextType` (line 6). Adding `getBlockPrefix` (line 15) returns a unique prefix key for a custom template of the attribute. ### Mapper diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index e1b32f1328..b94931dabb 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -432,7 +432,7 @@ As explained in [User Context Hash caching](context_aware_cache.md#user-context- user-context-hash. Users with the same user-context-hash here the same cache (as long as [[= product_name =]] responds with `Vary: X-Context-User-Hash`). -In order to simulate the requests the HTTP cache sends to [[= product_name =]], you need this user-context-hash. +To simulate the requests the HTTP cache sends to [[= product_name =]], you need this user-context-hash. To obtain it, use `curl`. ```bash @@ -450,7 +450,7 @@ Some notes about each of these parameters: - `--header "Surrogate-Capability: abc=ESI/1.0"`, strictly speaking not needed when fetching the user-context-hash, but this tells [[= product_name =]] that client understands ESI tags. It's good practice to always include this header when imitating the HTTP Cache. - `--header "accept: application/vnd.fos.user-context-hash"` tells [[= product_name =]] that the client wants to receive the user-context-hash -- `--header "x-fos-original-url: /"` is required by the fos-http-cache bundle in order to deliver the user-context-hash +- `--header "x-fos-original-url: /"` is required by the fos-http-cache bundle to deliver the user-context-hash - `https://www.staging.foobar.com.us-2.platformsh.site/_fos_user_context_hash` : here we use the hostname we earlier told curl how to resolve using `---resolve`. `/_fos_user_context_hash` is the route to the controller that are able to deliver the user-context-hash. @@ -510,7 +510,7 @@ So back to the original problem here. This resource is for some reason not cache `x-cache: MISS` we started with). But origin says this page can be cached for 1 day. How can that be? The likely reason is that this page also contains some ESI fragments and that one or more of these aren't cachable. -So, first let's see if there are any ESIs here. We remove the `-IXGET` options (in order to see content of the response, +So, first let's see if there are any ESIs here. We remove the `-IXGET` options (to see content of the response, not only headers) to curl and search for esi: ```bash @@ -535,7 +535,7 @@ shell. $ curl -IXGET --resolve www.staging.foobar.com.us-2.platformsh.site:443:1.2.3.4 --header "Surrogate-Capability: abc=ESI/1.0" --header "x-user-context-hash: daea248406c0043e62997b37292bf93a8c91434e8661484983408897acd93814" 'https://www.staging.foobar.com.us-2.platformsh.site/_fragment?_hash=B%2BLUWB2kxTCc6nc5aEEn0eEqBSFar%2Br6jNm8fvSKdWU%3D&_path=locationId%3D2%26contentId%3D52%26blockId%3D11%26versionNo%3D3%26languageCode%3Deng-GB%26serialized_siteaccess%3D%257B%2522name%2522%253A%2522site%2522%252C%2522matchingType%2522%253A%2522default%2522%252C%2522matcher%2522%253Anull%252C%2522provider%2522%253Anull%257D%26serialized_siteaccess_matcher%3Dnull%26_format%3Dhtml%26_locale%3Den_GB%26_controller%3DEzSystems%255CEzPlatformPageFieldTypeBundle%255CController%255CBlockController%253A%253ArenderAction' ``` -You can also note that this ESI is handled by a controller in the `FieldTypePage` bundle provided by [[= product_name =]]. +This ESI is handled by a controller in the `FieldTypePage` bundle provided by [[= product_name =]]. The output is: @@ -592,14 +592,14 @@ The `Set-Cookie` here may cause the problem. A ESI fragment should never set a c - Clients only receive the headers set in the "mother" document (the headers in the "/" response in this case). - Only the content of ESIs responses is returned to the client. **No headers set in the ESI response will ever reach the client**. ESI headers are only seen by the HTTP cache. - + - Symfony reverse proxy doesn't support ESIs at all, and any ESI calls (`render_esi()`) are implicitly replaced by sub-requests (`render()`). So any `Set-Cookie` **is** sent to the client when using Symfony reverse proxy. - + - Fastly flags it resource as "not cachable" because it set a cookie at least once. Even though that endpoint. stops setting cookies, Fastly still doesn't cache that fragment. Any document referring to that ESI is a `MISS`. - Fastly cache needs to be purged (`Purge-all` request) in order to remove this flag. - + Fastly cache needs to be purged (`Purge-all` request) to remove this flag. + - It means that it's not recommended to always initiate a session when loading the front page. You must ensure that you do not unintendedly start a session in a controller used by ESIs, for example, when trying to access as session variable before a session has been initiated yet. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md index c6bb35cd1c..431d754369 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md @@ -43,7 +43,7 @@ Vary: Cookie, Authorization ``` In the example above the response is set to be cached for 10 minutes. -It varies on the `Cookie` header in order to be able to cache it for the given user. +It varies on the `Cookie` header to be able to cache it for the given user. To optimize it, the default VCL strips any cookie other than session cookies to make this work. It also varies on `Authorization` to cover any possible basic authorization headers in case that is used over sessions for some requests. @@ -132,7 +132,7 @@ This solution requires more effort (controller, VCL logic and adapting your own For information on how user context hashes are generated, see [FOSHttpCacheBundle documentation](https://foshttpcachebundle.readthedocs.io/en/latest/features/user-context.html#generating-hashes). -[[= product_name =]] implements a custom context provider in order to make user context hash reflect the current User's roles and Limitations. +[[= product_name =]] implements a custom context provider to make user context hash reflect the current user's roles and limitations. This is needed given [[= product_name =]]'s more complex permission model compared to Symfony's. You can technically extend the user context hash by [implementing your own custom context provider(s)](https://foshttpcachebundle.readthedocs.io/en/latest/reference/configuration/user-context.html#custom-context-providers). diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 56f36288b4..894651849e 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -192,13 +192,13 @@ Persistence cache depends on all involved web servers, each of them seeing the s With that in mind, the following configurations of Redis are possible: - [Redis Cluster](https://redis.io/docs/management/scaling/) - - Shards cache across several instances in order to be able to cache more than memory of one server allows + - Shards cache across several instances to be able to cache more than memory of one server allows - Shard slaves can improve availability, however [they use asynchronous replication](https://redis.io/docs/management/scaling/#redis-cluster-consistency-guarantees) so they can't be used for reads - Unsupported Redis features that can affect performance: [pipelining](https://github.com/phpredis/phpredis/blob/develop/cluster.md#pipelining) and [most multiple key commands](https://github.com/phpredis/phpredis/blob/develop/cluster.md#multiple-key-commands) - [Redis Sentinel](https://redis.io/docs/management/sentinel/) - Provides high availability by providing one or several slaves (ideally 2 slaves or more, e.g. minimum 3 servers), and handle failover - [Slaves are asynchronously replicated](https://redis.io/docs/management/sentinel/#fundamental-things-to-know-about-sentinel-before-deploying), so they can't be used for reads - - Typically used with a load balancer (e.g. HAproxy with occasional calls to Redis Sentinel API) in the front in order to only speak to elected master + - Typically used with a load balancer (e.g. HAproxy with occasional calls to Redis Sentinel API) in the front to only speak to elected master - As of v3 you can also configure this [directly on the connection string]([[= symfony_doc =]]/components/cache/adapters/redis_adapter.html#configure-the-connection), **if** you use `Predis` instead of `php-redis` Several cloud providers have managed services that are easier to set up, handle replication and scalability for you, and might perform better. Notable services include: diff --git a/docs/infrastructure_and_maintenance/security/development_security.md b/docs/infrastructure_and_maintenance/security/development_security.md index 4a9d0fdb5e..1a85936b4f 100644 --- a/docs/infrastructure_and_maintenance/security/development_security.md +++ b/docs/infrastructure_and_maintenance/security/development_security.md @@ -80,7 +80,7 @@ By default, Symfony redirects to the [URI configured in `security.yaml` as `defa It's possible to use the "Remember me" functionality. Refer to the [Symfony cookbook on this topic]([[= symfony_doc =]]/security/remember_me.html). -If you want to use this feature, you must at least extend the login template in order to add the required checkbox: +If you want to use this feature, you must at least extend the login template to add the required checkbox: ``` html+twig {% extends "@IbexaCore/Security/login.html.twig" %} diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index 731fd9f22e..e94e68b620 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -139,7 +139,8 @@ It prevents uploading files that might be executed on the server, a Remote Code Attempting to upload files from the list results in an error message. There are also other safety measures in place, like using the web server configuration to block execution of uploaded scripts, see the next point. -You should adapt this list to your needs. Note that `svg` images are blocked because they may contain JavaScript code. +You should adapt this list to your needs. +`svg` images are blocked because they may contain JavaScript code. If you opt to allow them, make sure you take steps to mitigate the risk. The default list of blocked file types contains: `hta htm html jar js jse pgif phar php php3 php4 php5 phps phpt pht phtml svg swf xhtm xhtml`. diff --git a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md index b5ca18fd9e..687e929b05 100644 --- a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md +++ b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md @@ -32,7 +32,7 @@ The most important clues around increasing overall performance of your [[= produ #### How can I translate my back office? The language of the back office is based on the browser language. -In order to change it you should install the proper package for your language (see [language packages list](https://github.com/ezplatform-i18n)). +To change it you should install the proper package for your language (see [language packages list](https://github.com/ezplatform-i18n)). Once you have language packages installed, you can switch the language of the back office in the User Settings menu. If you do not have a language defined in the browser, it's selected based on the `parameters.locale_fallback` parameter located in `config/packages/ibexa.yaml`. @@ -98,8 +98,7 @@ rm -rf var/cache/* #### Where should I place my configuration files? -In order to avoid merge conflicts on important configuration settings during upgrades, -moving as much as possible of your configuration to your own files can be a good idea. +To avoid merge conflicts on important configuration settings during upgrades, moving as much as possible of your configuration to your own files can be a good idea. All project-specific parameters should be kept in separate files. For example, configuration for Page Blocks could be placed in `config/packages/landing_page_blocks.yaml`. diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index be3f55d785..e24aa5cbd6 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -180,4 +180,4 @@ When setting up SiteAccesses with different language versions, you can specify a You can also assign a Default content availability flag to content types (available in the Admin Panel). When this flag is assigned, content items of this type are available even when they do not have a language version in any of the languages configured for the current SiteAccess. -Note that if a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. +If a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index e617cfcca2..b20bdef658 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -14,7 +14,7 @@ If you're looking for the Long Term Support (LTS) release, see [https://ezplatfo [EZP-26885](https://issues.ibexa.co/browse/EZP-26885): you now have access to the Doctrine connection instead of the Zeta Components Database connection-like object which has been exposed to field types until now. -Note that the former way will be removed in a future major version. +The former way will be removed in a future major version. #### Content type limitation for Relation (single) field diff --git a/docs/release_notes/ez_platform_v2.0.0.md b/docs/release_notes/ez_platform_v2.0.0.md index f19dc859aa..68777b0234 100644 --- a/docs/release_notes/ez_platform_v2.0.0.md +++ b/docs/release_notes/ez_platform_v2.0.0.md @@ -23,7 +23,7 @@ eZ Platform has become a pure Symfony application, based on Symfony 3, which bri !!! note - Note that the move to [Symfony 3](https://symfony.com/roadmap?version=3.4) causes some changes, for example to the project's directory structure. + The move to [Symfony 3](https://symfony.com/roadmap?version=3.4) causes some changes, for example to the project's directory structure. Among others, the `var` directory now contains cache and logs. The `bin` directory is now used to call the `console` command, so use `bin/console` instead of `app/console`. diff --git a/docs/release_notes/ez_platform_v2.2.0.md b/docs/release_notes/ez_platform_v2.2.0.md index 133c5cddaa..b37e23459a 100644 --- a/docs/release_notes/ez_platform_v2.2.0.md +++ b/docs/release_notes/ez_platform_v2.2.0.md @@ -77,7 +77,7 @@ You can also [select which content types are treated the same way as user of use ### Change from UTF8 to UTF8MB4 -Database charset is changed from UTF8 to UTF8MB4, in order to support 4-byte characters. +Database charset is changed from UTF8 to UTF8MB4, to support 4-byte characters. !!! caution diff --git a/docs/release_notes/ez_platform_v2.4.md b/docs/release_notes/ez_platform_v2.4.md index f2864d1993..3145d45ee4 100644 --- a/docs/release_notes/ez_platform_v2.4.md +++ b/docs/release_notes/ez_platform_v2.4.md @@ -148,11 +148,11 @@ This release introduces a few simplifications to API use for content types: - Exposes `content->getContentType()` for easier use, including from Twig as `content.contentType`. When iterating over the result set of content/Locations these are effectively loaded all at once. - Adds possibility to load several content types in bulk using `ContentTypeService->loadContentTypeList()`. -- `UserService` now exposes `isUser()` and `isUserGroup()`. They do not need to do a lookup to the database in order to tell if a content item is of type user or user group. +- `UserService` now exposes `isUser()` and `isUserGroup()`. They do not need to do a lookup to the database to tell if a content item is of type user or user group. #### Load multiple Locations -you're now able to load multiple Locations at once, using `LocationService->loadLocationList()`. The biggest benefit of this feature is saving load time on complex landing pages when HTTP cache is cold or disabled, including when in development mode. +you're now able to load multiple Locations at once, using `LocationService->loadLocationList()`. The biggest benefit of this feature is saving load time on complex landing pages when HTTP cache is cold or disabled, including when in development mode. ### BC breaks and important behavior changes diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 0f427fea50..315e705119 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -235,8 +235,7 @@ even if they would not have access to the trashed content. ### Docker environment -BCMath PHP extension has been added to the Docker environments -in order to enable the Allure reporting tool. +BCMath PHP extension has been added to the Docker environments to enable the Allure reporting tool. ### Deprecated features diff --git a/docs/search/search_engines/elastic_search/configure_elastic_search.md b/docs/search/search_engines/elastic_search/configure_elastic_search.md index 2553deffe5..cb594c7079 100644 --- a/docs/search/search_engines/elastic_search/configure_elastic_search.md +++ b/docs/search/search_engines/elastic_search/configure_elastic_search.md @@ -6,7 +6,7 @@ description: Configure Elasticsearch to use it with Ibexa DXP. ## Configure connections -To configure Elasticsearch, first, you need to configure the connections. +To configure Elasticsearch, first, you need to configure the connections. There are two possibilities of connection: diff --git a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md index db0eb5afe6..01edb6985c 100644 --- a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md +++ b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md @@ -173,7 +173,7 @@ To add a template like this to your site, create a `main_layout.html.twig` file ``` -Note that in the highlighted lines (12 and 89) the template takes advantage of [Symfony Webpack Encore]([[= symfony_doc =]]/frontend.html#webpack-encore). +In the highlighted lines (12 and 89) the template takes advantage of [Symfony Webpack Encore]([[= symfony_doc =]]/frontend.html#webpack-encore). This tutorial leads you through configuring Webpack, but first you need assets. ### Adding assets @@ -213,7 +213,7 @@ Encore ]); ``` -Note that `.addStyleEntry('tutorial', [])` and `.addEntry('tutorial-js', [])` refer respectively to +`.addStyleEntry('tutorial', [])` and `.addEntry('tutorial-js', [])` refer respectively to `{{ encore_entry_link_tags('tutorial') }}` and `{{ encore_entry_script_tags('tutorial-js') }}` from `main_layout.html.twig`. This configuration creates a bundle consisting of files to be added to a template. diff --git a/docs/tutorials/beginner_tutorial/7_embed_content.md b/docs/tutorials/beginner_tutorial/7_embed_content.md index a3c3edfab1..04b1184692 100644 --- a/docs/tutorials/beginner_tutorial/7_embed_content.md +++ b/docs/tutorials/beginner_tutorial/7_embed_content.md @@ -32,11 +32,11 @@ Then add all Fields with the following information:  Confirm the creation of the content type by selecting **Create**. Create a *Landmarks* Folder and add some Landmarks to it. -Note that you need pictures (for the Photo Field) to represent them. +You need pictures (for the Photo Field) to represent them. ## Add Landmarks to Ride content type definition -Now edit the Ride content type in order to add a Multiple Content Relation between the two content types. +Now edit the Ride content type to add a Multiple Content Relation between the two content types. Create a new **Content relations (multiple)** Field called "Landmarks" with identifier `landmarks` and allow content type "Landmark" to be added to it: ![Adding Landmarks to the Ride content type](bike_ride_adding_landmarks_to_the_ride_content_type.png "Adding a relation between the Ride and the Landmark using Content Relations (multiple)") diff --git a/docs/tutorials/generic_field_type/4_introduce_a_template.md b/docs/tutorials/generic_field_type/4_introduce_a_template.md index a8164fc77e..d149fe7b06 100644 --- a/docs/tutorials/generic_field_type/4_introduce_a_template.md +++ b/docs/tutorials/generic_field_type/4_introduce_a_template.md @@ -6,12 +6,12 @@ description: Learn how to add a template for rendering the custom Field on the s ## Point 2D template -In order to display data from the field type, you need to create and register a template for it. +To display data from the field type, you need to create and register a template for it. Each field type template receives a set of variables that can be used to achieve the desired goal. In this case the most important variable is the `field`, an instance of `Ibexa\Contracts\Core\Repository\Values\Content\Field`. In addition to its own metadata (`id`, `fieldDefIdentifier`, etc.), it exposes the Field Value through the `value` property. -Remember that field type templates can be overridden in order to tweak what is displayed and how. +Remember that field type templates can be overridden to tweak what is displayed and how. For more information, see the documentation about [field type templates](form_and_template.md#content-view-templates). First, create a `point2d_field.html.twig` template in the `templates` directory. diff --git a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md index ee8bfe3b73..0f73ab798a 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md @@ -679,7 +679,7 @@ You can find it in https://github.com/ezsystems/ezplatform-ee-installer/blob/2.3 !!! caution "Form (ezform) field type" - After the update, in order to create forms, you have to add a new content type (for example, named "Form") that contains `Form` field (this content type can contain other fields + After the update, to create forms, you have to add a new content type (for example, named "Form") that contains `Form` field (this content type can contain other fields as well). After that you can use forms inside landing pages via Embed block. ### C. Update to v2.4 @@ -832,7 +832,7 @@ CREATE INDEX ezpage_pages_content_id_version_no ON ezpage_pages(content_id, vers ##### Powered-By header -In order to promote use of eZ Platform, `ezsystems/ez-support-tools` v1.0.10, as of eZ Platform v2.5.16, sets the Powered-By header. +To promote use of eZ Platform, `ezsystems/ez-support-tools` v1.0.10, as of eZ Platform v2.5.16, sets the Powered-By header. It's enabled by default and generates a header like `Powered-By: eZ Platform Enterprise v2`. To omit the version number, use the following configuration: diff --git a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md index c41b2a5b6f..09ef65e4b6 100644 --- a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md +++ b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md @@ -29,21 +29,21 @@ This folder also contains `config/packages/ezplatform.yaml`, which contains all #### PHP code and bundle organization Since Symfony 4 `src/` code is no longer organized in bundles, `AppBundle` has been removed from the default eZ Platform install. -In order to adapt, you'll need to move all your PHP code, such as controllers or event listeners, to the `src` folder and use the `App` namespace for your custom code instead. +To adapt, you'll need to move all your PHP code, such as controllers or event listeners, to the `src` folder and use the `App` namespace for your custom code instead. !!! tip "How to make AppBundle continue to work, for now" Refactoring bundles for `src/` folder can involve extensive changes, if you want to make your `src/AppBundle` continue to work, follow [an Autoloading src/AppBundle guide on Symfony Casts](https://symfonycasts.com/screencast/symfony4-upgrade/flex-composer.json#autoloading-src-amp-src-appbundle). - + You can also follow [Using a "path" Repository guide](https://symfonycasts.com/screencast/symfony-bundle/extracting-bundle#using-a-path-repository), to create a [composer path repository](https://getcomposer.org/doc/05-repositories.md#path). If you have several bundles you can move them into a `packages/` directory and load them all with: - + ``` "repositories": [ { "type": "path", "url": "packages/*" }, ], ``` - + Once you're ready to refactor the code to `App` namespace, follow [Bye Bye AppBundle](https://symfonycasts.com/screencast/symfony4-upgrade/bye-appbundle) article. #### View templates diff --git a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md index 02a6e296df..eb3aaa9d96 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md @@ -6,7 +6,7 @@ description: Update procedure to v4.4 for people who use deprecated Commerce pac This update procedure applies if you have a v4.3 installation, you use Commerce packages and would like to continue to use them. -Note that all commerce packages as of v4.4 are deprecated and will be removed in v5. +All commerce packages as of v4.4 are deprecated and will be removed in v5. Until that time, they will be maintained by Ibexa with fixes, including security fixes, but they won't be further developed. Old packages are replaced by [the all-new Ibexa Commerce packages](ibexa_dxp_v4.4.md#all-new-ibexa-commerce-packages). diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index 10c0cb932e..ff57a316bf 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -283,7 +283,7 @@ The script also has an `--image-content-types` option which you should use if yo `php bin/console ezxmltext:convert-to-richtext --image-content-types=image,custom_image -v` -The script needs to know these identifiers in order to convert `` tags correctly. Failing to do so prevents the editor from showing image thumbnails of embedded image objects. You may find the image content types in your installation by looking for these settings in `content.ini(.append.php)`: +The script needs to know these identifiers to convert `` tags correctly. Failing to do so prevents the editor from showing image thumbnails of embedded image objects. You may find the image content types in your installation by looking for these settings in `content.ini(.append.php)`: ``` [RelationGroupSettings] @@ -358,7 +358,7 @@ The first log message is a notice about the `ez-temporary=1` attribute which the The second log message is an error, but the cause described may be confusing. During the conversion, the `` element is converted to an `` tag, which is problematic. The exact problem in this case is the value of the second align attribute: `` tag. ``` ### Add Media permission -To be able to view the `photo` Field you have to add a `read` permission to `Media` section. +To be able to view the `photo` field you have to add a `read` permission to `Media` section. In the main menu, go to **Admin** (gear icon) -> **Roles**, and click the **Anonymous** role. diff --git a/docs/tutorials/beginner_tutorial/7_embed_content.md b/docs/tutorials/beginner_tutorial/7_embed_content.md index 04b1184692..6666dbbb87 100644 --- a/docs/tutorials/beginner_tutorial/7_embed_content.md +++ b/docs/tutorials/beginner_tutorial/7_embed_content.md @@ -20,7 +20,7 @@ A Landmark is an interesting place that Rides go through. Each Ride may be relat - **Name**: Landmark - **Identifier**: landmark -Then add all Fields with the following information:  +Then add all fields with the following information:  | Field type | Name | Identifier | Required | Searchable | Translatable | | ------------ | ---------------- | ---------------- | --------- | ---------- | ------------ | @@ -32,12 +32,12 @@ Then add all Fields with the following information:  Confirm the creation of the content type by selecting **Create**. Create a *Landmarks* Folder and add some Landmarks to it. -You need pictures (for the Photo Field) to represent them. +You need pictures (for the Photo field) to represent them. ## Add Landmarks to Ride content type definition Now edit the Ride content type to add a Multiple Content Relation between the two content types. -Create a new **Content relations (multiple)** Field called "Landmarks" with identifier `landmarks` and allow content type "Landmark" to be added to it: +Create a new **Content relations (multiple)** field called "Landmarks" with identifier `landmarks` and allow content type "Landmark" to be added to it: ![Adding Landmarks to the Ride content type](bike_ride_adding_landmarks_to_the_ride_content_type.png "Adding a relation between the Ride and the Landmark using Content Relations (multiple)") diff --git a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md index 99dd03a5c9..8e87d2cd07 100644 --- a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md +++ b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md @@ -1,5 +1,5 @@ --- -description: Learn how to create a Value class that stores the value of the Field. +description: Learn how to create a Value class that stores the value of the field. --- # Step 1 - Implement the Point 2D Value class @@ -18,7 +18,7 @@ Open your project with a clean installation and create the base directory for a The Value class of a field type is by design very simple. It's used to represent an instance of the field type within a content item. -Each Field presents its data using an instance of the Type's Value class. +Each field presents its data using an instance of the Type's Value class. For more information about field type Value, see [Value handling](type_and_value.md#value-handling). !!! tip diff --git a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md index 3c58e7b09e..aa6e1b68fc 100644 --- a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md +++ b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md @@ -1,5 +1,5 @@ --- -description: Learn how to create the Type class which contains the logic for the Field. +description: Learn how to create the Type class which contains the logic for the field. --- # Step 2 - Define the Point 2D field type diff --git a/docs/tutorials/generic_field_type/3_create_form_for_point2d.md b/docs/tutorials/generic_field_type/3_create_form_for_point2d.md index a794996c79..ad6ab18cfb 100644 --- a/docs/tutorials/generic_field_type/3_create_form_for_point2d.md +++ b/docs/tutorials/generic_field_type/3_create_form_for_point2d.md @@ -1,5 +1,5 @@ --- -description: Learn how to create a form used for editing a custom Field definition. +description: Learn how to create a form used for editing a custom field definition. --- # Step 3 - Create a form for editing field type @@ -17,7 +17,7 @@ This method adds fields for `x` and `y` coordinates. ## Add a Form Mapper Interface -The FormMapper adds the Field definitions into Symfony forms using the `add()` method. +The FormMapper adds the field definitions into Symfony forms using the `add()` method. The `FieldValueFormMapperInterface` provides an edit form for your field type in the administration interface. For more information about the FormMappers, see [field type form and template](form_and_template.md). @@ -25,8 +25,8 @@ First, implement a `FieldValueFormMapperInterface` interface (`Ibexa\Contracts\C Next, implement a `mapFieldValueForm()` method and invoke `FormInterface::add` method with the following arguments (highlighted lines): -- Name of the property the Field value maps to: `value` -- Type of the Field: `Point2DType::class` +- Name of the property the field value maps to: `value` +- Type of the field: `Point2DType::class` - Custom options: `required` and `label` Final version of the Type class should have the following statements and functions: diff --git a/docs/tutorials/generic_field_type/4_introduce_a_template.md b/docs/tutorials/generic_field_type/4_introduce_a_template.md index d149fe7b06..353b390785 100644 --- a/docs/tutorials/generic_field_type/4_introduce_a_template.md +++ b/docs/tutorials/generic_field_type/4_introduce_a_template.md @@ -1,5 +1,5 @@ --- -description: Learn how to add a template for rendering the custom Field on the site front. +description: Learn how to add a template for rendering the custom field on the site front. --- # Step 4 - Introduce a template @@ -9,7 +9,7 @@ description: Learn how to add a template for rendering the custom Field on the s To display data from the field type, you need to create and register a template for it. Each field type template receives a set of variables that can be used to achieve the desired goal. In this case the most important variable is the `field`, an instance of `Ibexa\Contracts\Core\Repository\Values\Content\Field`. -In addition to its own metadata (`id`, `fieldDefIdentifier`, etc.), it exposes the Field Value through the `value` property. +In addition to its own metadata (`id`, `fieldDefIdentifier`, etc.), it exposes the field Value through the `value` property. Remember that field type templates can be overridden to tweak what is displayed and how. For more information, see the documentation about [field type templates](form_and_template.md#content-view-templates). diff --git a/docs/tutorials/generic_field_type/5_add_a_field.md b/docs/tutorials/generic_field_type/5_add_a_field.md index 539028721d..c76df827e0 100644 --- a/docs/tutorials/generic_field_type/5_add_a_field.md +++ b/docs/tutorials/generic_field_type/5_add_a_field.md @@ -1,8 +1,8 @@ --- -description: Learn how to use your custom field type by adding a Field to a content type and creating an instance. +description: Learn how to use your custom field type by adding a field to a content type and creating an instance. --- -# Step 5 - Add a new Point 2D Field +# Step 5 - Add a new Point 2D field All actions in this step are done in the admin interface also called the back office. Go to the admin interface (`/admin`) and log in with the default username: `admin` and the default password: `publish`. @@ -22,7 +22,7 @@ New content type should have the following settings: ![Adding new field](point2d_field_definition.png) -Next, define **point2d** with the following Fields: +Next, define **point2d** with the following fields: |Field type|Name|Identifier|Required|Translatable| |----------|----|----------|--------|------------| diff --git a/docs/tutorials/generic_field_type/7_add_a_validation.md b/docs/tutorials/generic_field_type/7_add_a_validation.md index f28b66bce9..9dcb644b72 100644 --- a/docs/tutorials/generic_field_type/7_add_a_validation.md +++ b/docs/tutorials/generic_field_type/7_add_a_validation.md @@ -1,5 +1,5 @@ --- -description: Learn how to validate custom Field data. +description: Learn how to validate custom field data. --- # Step 7 - Add basic validation diff --git a/docs/tutorials/generic_field_type/8_data_migration.md b/docs/tutorials/generic_field_type/8_data_migration.md index f05138a1e0..01ff0a951f 100644 --- a/docs/tutorials/generic_field_type/8_data_migration.md +++ b/docs/tutorials/generic_field_type/8_data_migration.md @@ -1,5 +1,5 @@ --- -description: Learn how to serialize and deserialize Field data to enable sorting or search. +description: Learn how to serialize and deserialize field data to enable sorting or search. --- # Step 8 - Data migration between field type versions diff --git a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md index 453abbaea2..85dd6bd28b 100644 --- a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md +++ b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md @@ -44,13 +44,13 @@ Log in to the back office – add `/admin` to your installation's address (`` . + To see usage details for each of the commands, run `bin/console help ` . For more information, see the package's [online documentation](https://github.com/thephpleague/oauth2-server-bundle/blob/master/docs/basic-setup.md). diff --git a/docs/users/passwords.md b/docs/users/passwords.md index 42f66eacdd..1a290245b5 100644 --- a/docs/users/passwords.md +++ b/docs/users/passwords.md @@ -24,8 +24,7 @@ By default, it's set to `PT1H` (one hour). ## Revoking passwords In case of a security situation such as a data leakage, you may need to force users to change their passwords. -You can do it with the help of the `ibexa:user:expire-password` command, -which revokes the passwords for specific users, user groups or users belonging to the chosen content type. +You can do it with the help of the `ibexa:user:expire-password` command, which revokes the passwords for specific users, user groups, or users belonging to the chosen content type. To select which users to revoke passwords for, use one of the following options with the command: @@ -54,7 +53,7 @@ php bin/console ibexa:user:expire-password --user-group-id=13 ## Password rules You can customize the password policy in your project. -Each password setting is customizable per User field type. +Each password setting is customizable per user field type. You can change the [password attributes](#password-attributes) or [password expiration settings](#password-expiration), and determine the rules for [repeating passwords](#repeating-passwords). To access the password settings: @@ -66,7 +65,7 @@ To access the password settings: !!! tip - There can be other content types that function as users, beyond the built-in User content type. + There can be other content types that function as users, beyond the built-in user content type. For details, see [User Identifiers](repository_configuration.md#user-identifiers). ## Password attributes @@ -82,7 +81,7 @@ You can also set the minimum password length. ## Password expiration -In the **User account (ezuser)** Field definition, you can set password expiration rules, which forces users to change their passwords periodically. +In the **User account (ezuser)** field definition, you can set password expiration rules, which forces users to change their passwords periodically. ![Password expiry settings](password_expiry.png) @@ -104,7 +103,7 @@ This rule is valid by default when password expiration is set. ## Breached passwords You can set a rule that prevents using passwords which have been exposed in a public breach. -To do this, in the **User account (ezuser)** Field definition, select "Password must not be contained in a public breach". +To do this, in the **User account (ezuser)** field definition, select "Password must not be contained in a public breach". ![Protection against using breached passwords](password_breached.png) @@ -114,5 +113,4 @@ It does not check existing passwords, so it won't block login for anyone. It app !!! note The password itself isn't sent to the https://haveibeenpwned.com/ API, which makes this check secure. - For more information on how that is possible, - see [Validating Leaked Passwords with k-Anonymity](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/). + For more information on how that is possible, see [Validating Leaked Passwords with k-Anonymity](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/). diff --git a/docs/users/segment_api.md b/docs/users/segment_api.md index 3cacd22bc1..a025b2ebe7 100644 --- a/docs/users/segment_api.md +++ b/docs/users/segment_api.md @@ -1,5 +1,5 @@ --- -description: You can use PHP API to get Segment information, create and manage Segments, and assign users to them. +description: You can use PHP API to get segment information, create and manage segments, and assign users to them. edition: experience --- @@ -7,18 +7,18 @@ edition: experience Segments enable you to profile the content displayed to specific users. -To manage Segments, use the `SegmentationService`. +To manage segments, use the `SegmentationService`. -## Getting Segment information +## Getting segment information -To load a Segment Group, use `SegmentationService::loadSegmentGroupByIdentifier()`. -Get all Segments assigned to the group with `SegmentationService::loadSegmentsAssignedToGroup()`: +To load a segment group, use `SegmentationService::loadSegmentGroupByIdentifier()`. +Get all segments assigned to the group with `SegmentationService::loadSegmentsAssignedToGroup()`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 54, 62) =]] ``` -Similarly, you can load a Segment by using `SegmentationService::loadSegmentByIdentifier()`: +Similarly, you can load a segment by using `SegmentationService::loadSegmentByIdentifier()`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 62, 63) =]] @@ -26,7 +26,7 @@ Similarly, you can load a Segment by using `SegmentationService::loadSegmentById ## Checking assignment -You can check whether a user is assigned to a Segment with `SegmentationService::isUserAssignedToSegment()`: +You can check whether a user is assigned to a segment with `SegmentationService::isUserAssignedToSegment()`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 66, 71) =]] @@ -34,40 +34,35 @@ You can check whether a user is assigned to a Segment with `SegmentationService: ## Assigning users -To assign a user to a Segment, use `SegmentationService::assignUserToSegment()`: +To assign a user to a segment, use `SegmentationService::assignUserToSegment()`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 64, 65) =]] ``` -## Creating Segments +## Creating segments -Each Segment must be assigned to a Segment Group. +Each segment must be assigned to a segment group. -To create a Segment Group, use `SegmentationService::createSegmentGroup()` -and provide it with a `SegmentGroupCreateStruct`: +To create a segment group, use `SegmentationService::createSegmentGroup()` and provide it with a `SegmentGroupCreateStruct`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 38, 45) =]] ``` -To add a Segment, use `SegmentationService::createSegment()` -and provide it with a `SegmentCreateStruct`, which takes an existing group as one of the parameters: +To add a segment, use `SegmentationService::createSegment()` and provide it with a `SegmentCreateStruct`, which takes an existing group as one of the parameters: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SegmentCommand.php', 46, 53) =]] ``` -## Updating Segments +## Updating segments -To update a Segment or a Segment Group, use `SegmentationService::updateSegment()` -or `SegmentationService::updateSegmentGroup()` and provide it with `SegmentUpdateStruct` -or `SegmentGroupUpdateStruct`, respectively. +To update a segment or a segment group, use `SegmentationService::updateSegment()` or `SegmentationService::updateSegmentGroup()` and provide it with `SegmentUpdateStruct` or `SegmentGroupUpdateStruct`. -## Deleting Segments +## Deleting segments -To delete a Segment or a Segment Group, use `SegmentationService::removeSegment()` -or `SegmentationService::removeSegmentGroup()`, respectively: +To delete a segment or a segment group, use `SegmentationService::removeSegment()` or `SegmentationService::removeSegmentGroup()`: ``` php $this->segmentationService->removeSegmentGroup($group); From 88aac466b9021cf252849fae1685c1d6e81f0af8 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 11:07:51 +0200 Subject: [PATCH 13/77] Fixes --- docs/administration/admin_panel/admin_panel.md | 4 ++-- .../admin_panel/corporate_admin_panel.md | 2 +- .../admin_panel/languages_admin_panel.md | 2 +- docs/administration/admin_panel/roles_admin_panel.md | 9 +++++---- .../administration/admin_panel/segments_admin_panel.md | 4 ++-- .../admin_panel/url_management_admin_panel.md | 4 ++-- docs/administration/admin_panel/users_admin_panel.md | 4 ++-- .../dashboard/configure_default_dashboard.md | 10 +++++----- .../content_management/content_api/browsing_content.md | 1 + docs/content_management/locations.md | 4 ++-- .../security/security_checklist.md | 2 +- docs/multisite/languages/languages.md | 4 ++-- docs/permissions/permission_use_cases.md | 2 +- docs/release_notes/ez_platform_v1.7.0_lts.md | 2 +- docs/release_notes/ez_platform_v2.5.md | 2 +- docs/release_notes/ez_platform_v3.1.md | 2 +- docs/search/search_criteria_and_sort_clauses.md | 2 +- .../migrating_from_ez_publish_platform.md | 2 +- docs/users/user_management_guide.md | 2 +- 19 files changed, 33 insertions(+), 31 deletions(-) diff --git a/docs/administration/admin_panel/admin_panel.md b/docs/administration/admin_panel/admin_panel.md index 08cf8b9b06..ed7f692e43 100644 --- a/docs/administration/admin_panel/admin_panel.md +++ b/docs/administration/admin_panel/admin_panel.md @@ -6,9 +6,9 @@ page_type: landing_page # Admin panel Once you set up your environment you can start your work as an administrator. -Your most functional tools can be found in **Admin Panel**. +You can find key tools in **Admin** panel. -To access Admin Panel, click the icon: ![Admin Panel Icon](admin_panel_icon.png){.inline-image}. +To access **Admin** panel, click the icon: ![Admin panel Icon](admin_panel_icon.png){.inline-image}. [[= cards([ "administration/admin_panel/users_admin_panel", diff --git a/docs/administration/admin_panel/corporate_admin_panel.md b/docs/administration/admin_panel/corporate_admin_panel.md index db7a00709c..11b4be2fac 100644 --- a/docs/administration/admin_panel/corporate_admin_panel.md +++ b/docs/administration/admin_panel/corporate_admin_panel.md @@ -4,7 +4,7 @@ description: You can manage companies profiles in the Admin Panel. # Corporate -You can manage companies profiles in the Admin Panel. +You can manage companies profiles in the **Admin** panel. There, in the **Corporate** section, you can find basic information about existing companies, for example, details, versions, locations, translations, a list of members, billing addresses, and technical details regarding the organization, such as visibility, IDs, or relations. diff --git a/docs/administration/admin_panel/languages_admin_panel.md b/docs/administration/admin_panel/languages_admin_panel.md index a4b97f9f47..0d2c226e72 100644 --- a/docs/administration/admin_panel/languages_admin_panel.md +++ b/docs/administration/admin_panel/languages_admin_panel.md @@ -6,7 +6,7 @@ description: Ibexa DXP offers the ability to create multiple translations of you [[= product_name =]] offers the ability to create multiple translations of your website. Which version is shown to a visitor depends on the way your installation is set up. -A new language version for the website can be added in the [Admin Panel](admin_panel.md) in the **Languages** tab. +You can add a new language version for the website in the [Admin Panel](admin_panel.md) in the **Languages** tab. Every new language must have a name and a language code, written in the `xxx-XX` format, for example `eng-GB` etc. diff --git a/docs/administration/admin_panel/roles_admin_panel.md b/docs/administration/admin_panel/roles_admin_panel.md index a1dd7ffd1b..6c1b5b613c 100644 --- a/docs/administration/admin_panel/roles_admin_panel.md +++ b/docs/administration/admin_panel/roles_admin_panel.md @@ -4,7 +4,7 @@ description: To give users an access to your website you need to assign them rol # Roles -To give users an access to your website you need to assign them roles in the Admin Panel. +To give users an access to your website you need to assign them roles in the **Admin** panel. ![Roles](admin_panel_roles.png "Roles") @@ -14,7 +14,7 @@ Each role consists of: ![Policies](admin_panel_policies.png "Policies") -Rules that give users access to different function in a module. +Policies are the rules that give users access to different function in a module. You can restrict what user can do with limitations. The available limitations depend on the chosen policy. When policy has more than one limitation, all of them have to apply. @@ -35,8 +35,9 @@ Every user or user group can have multiple roles. A user can also belong to many groups, for example, Administrators, Editors, Subscribers. Best practice is to avoid assigning roles to users directly. -Model your content (content types, Sections, Locations etc.) in a way that can be accessed by generic roles. +Model your content (content types, sections, locations etc.) in a way that can be accessed by generic roles. That way system is be more secure and easier to manage. -This approach also improves performance. Role assignments and policies are taken into account during search/load queries. +This approach also improves performance. +Role assignments and policies are taken into account during search/load queries. See [Permissions overview](permissions.md) for further information and [Permission use cases](permission_use_cases.md) for details on how to customize access to different parts of the back office. \ No newline at end of file diff --git a/docs/administration/admin_panel/segments_admin_panel.md b/docs/administration/admin_panel/segments_admin_panel.md index 0abc63e172..36e43aaa00 100644 --- a/docs/administration/admin_panel/segments_admin_panel.md +++ b/docs/administration/admin_panel/segments_admin_panel.md @@ -6,9 +6,9 @@ edition: experience # Segments You can use segments to display specific content to specific [ussers](users.md). -they're used out of the box in the Targeting and Dynamic targeting blocks in the page. +They're used out of the box in the Targeting and Dynamic targeting blocks in the page. -Segments are collected in segment groups: +You can collect segments in segment groups: ![Segment Groups](admin_panel_segment_groups.png) diff --git a/docs/administration/admin_panel/url_management_admin_panel.md b/docs/administration/admin_panel/url_management_admin_panel.md index bbe0768b4f..23bb6d5292 100644 --- a/docs/administration/admin_panel/url_management_admin_panel.md +++ b/docs/administration/admin_panel/url_management_admin_panel.md @@ -1,10 +1,10 @@ --- -description: URL Management let you manage external URL addresses and URL wildcards. +description: URL Management lets you manage external URL addresses and URL wildcards. --- # URL Management -You can manage external URL addresses and URL wildcards in the Admin Panel. +You can manage external URL addresses and URL wildcards in the **Admin** panel. Configure URL aliases to have human-readable URL addresses throughout your system. See [URL management](url_management.md) for further information. diff --git a/docs/administration/admin_panel/users_admin_panel.md b/docs/administration/admin_panel/users_admin_panel.md index 6ac21cb991..3604f57a7b 100644 --- a/docs/administration/admin_panel/users_admin_panel.md +++ b/docs/administration/admin_panel/users_admin_panel.md @@ -1,11 +1,11 @@ --- -description: All user groups and users can be accessed in the users tab. +description: You can access all users and user groups in the users tab. --- # Users [Users](users.md) in [[= product_name =]] are treated the same way as content items. -they're organized in groups such as *Guests*, *Editors*, *Anonymous*, which makes it easier to manage them and their permissions. +They're organized in groups such as *Guests*, *Editors*, *Anonymous*, which makes it easier to manage them and their permissions. All user groups and users can be accessed in the Admin panel by selecting **Users**. ![Users and user groups](admin_panel_users.png "Users and user groups") diff --git a/docs/administration/dashboard/configure_default_dashboard.md b/docs/administration/dashboard/configure_default_dashboard.md index cbfbf89153..7d8fa52315 100644 --- a/docs/administration/dashboard/configure_default_dashboard.md +++ b/docs/administration/dashboard/configure_default_dashboard.md @@ -32,7 +32,7 @@ All the settings in the configuration are reflected in the back office. ## Container remote ID Defines starting location container for all the dashboards, including customized and predifined ones. -You can see it in the Admin panel, **Dashboards** section, **Dashboards** folder in the content tree. +You can see it in the **Admin** panel, **Dashboards** section, **Dashboards** folder in the content tree. In the **Technical details** tab, it is defined as **Location remote ID**. ![Container remote ID](dashboard_container_remote_id.png) @@ -41,19 +41,19 @@ In the **Technical details** tab, it is defined as **Location remote ID**. Specifies default predefined dashboard. All the users can see this dashboard as a starting dashboard in the back office. -You can see it in the Admin panel, **Dashboards** section, **Default dashboard** folder inside of **Predefined dashboards** container in the content tree. +You can see it in the **Admin** panel, **Dashboards** section, **Default dashboard** folder inside of **Predefined dashboards** container in the content tree. In the **Technical details** tab, it's defined as **Location remote ID**. ## Users container remote ID Defines a container for users folders, which contain all customized dashboards. -You can see it in the Admin panel, **Dashboards** section, **User dashboards** folder inside of main **Dashboards** container in the content tree. +You can see it in the **Admin** panel, **Dashboards** section, **User dashboards** folder inside of main **Dashboards** container in the content tree. In the **Technical details** tab, it's defined as **Location remote ID**. ## Predefined container remote ID Defines a container that contains all predefined dashboards created by Administrator. -You can see it in the Admin panel, **Dashboards** section, **Predefined dashboards** folder inside of main **Dashboards** container in the content tree. +You can see it in the **Admin** panel, **Dashboards** section, **Predefined dashboards** folder inside of main **Dashboards** container in the content tree. In the **Technical details** tab, it's defined as **Location remote ID**. ## Section identifier @@ -63,7 +63,7 @@ Specifies the name of the [Section](sections.md). ## Content type identifier It is an identifier that represents dashboard content type. -You can find it in the Admin panel, **Dashboard content Ttpe** section, **View/Global properties** tab. +You can find it in the **Admin** panel, **Dashboard content Ttpe** section, **View/Global properties** tab. ![Content type identifier](dashboard_content_type_identifier.png) diff --git a/docs/content_management/content_api/browsing_content.md b/docs/content_management/content_api/browsing_content.md index 504847d9cb..cc15a0428e 100644 --- a/docs/content_management/content_api/browsing_content.md +++ b/docs/content_management/content_api/browsing_content.md @@ -207,6 +207,7 @@ $output->writeln("Parent Location: " . $mainLocation->getParentLocation()->pathS When dealing with location objects (and Trash objects), you can get access to content item directly using `$location->getContent`. In Twig this can also be accessed by `location.content`. +This is a lazy property. It triggers loading of content when first used. In case of bulk of locations coming from Search or Location Service, the content is also loaded in bulk for the whole location result set. diff --git a/docs/content_management/locations.md b/docs/content_management/locations.md index 0d4abbe7cf..4b32cfeebf 100644 --- a/docs/content_management/locations.md +++ b/docs/content_management/locations.md @@ -62,13 +62,13 @@ It contains a Folder content item. **Users** is the top level Location that contains the built-in system for managing user accounts. -![Users in admin panel](admin_panel_users.png "Users in admin panel") +![Users in Admin panel](admin_panel_users.png "Users in Admin panel") A user is simply a content item of the user account content type. The users are organized within user group content items below this Location. In other words, the **Users** Location contains the actual users and user groups, -which can be viewed by selecting the **Users** tab in the Admin Panel. +which can be viewed by selecting the **Users** tab in the **Admin** Panel. The default ID number of the **Users** Location is 5. It contains user group content items. diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index e94e68b620..f081addb83 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -190,7 +190,7 @@ Or use other permission-based [**Limitations**](https://doc.ibexa.co/en/latest/p Security should be a multi-layered exercise. It's wise to minimize what features you make available to the world, even if there are no known or suspected vulnerabilities in those features, and even if your content is properly protected by roles and policies. Reduce your attack surface by exposing only what you must. - If possible, make the back office unavailable on the open internet. -- [Symfony FOSJsRoutingBundle](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) is required in those releases where it's included, to expose routes to JavaScript. It exposes only the required routes, nothing more. It's only required in the back office site access though, so you can consider blocking it in other site accesses. You should also go through your own custom routes, and decide for each if you need to expose them or not. See the documentation on [YAML route definitions for exposure](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/blob/master/Resources/doc/usage.rst#generating-uris). +- [Symfony FOSJsRoutingBundle](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) is required in those releases where it's included, to expose routes to JavaScript. It exposes only the required routes, nothing more. It's only required in the back office SiteAccess though, so you can consider blocking it in other SiteAccesses. You should also go through your own custom routes, and decide for each if you need to expose them or not. See the documentation on [YAML route definitions for exposure](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/blob/master/Resources/doc/usage.rst#generating-uris). - By default, a [Powered-By header](https://doc.ibexa.co/en/latest/update_and_migration/from_1.x_2.x/update_db_to_2.5/#powered-by-header) is set. It specifies what version of the DXP is running. For example, `x-powered-by: Ibexa Experience v4`. This doesn't expose anything that couldn't be detected through other means. But if you wish to obscure this, you can either omit the version number, or disable the header entirely. - Consider whether certain interfaces must be left available on the open internet. For example: - The `/search` and `/graphql` endpoints diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index e24aa5cbd6..8a43b2ad67 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -19,7 +19,7 @@ publishing the draft doesn't overwrite later modifications. ### Adding available languages -The multilanguage system operates based on a global translation list that contains all languages available in the installation. Languages can be [added to this list from the Admin Panel](https://doc.ibexa.co/projects/userguide/en/latest/content_management/translate_content/) in the back office. After adding a language be sure to dump all assets to the file system: +The multilanguage system operates based on a global translation list that contains all languages available in the installation. Languages can be [added to this list from the **Admin** panel](https://doc.ibexa.co/projects/userguide/en/latest/content_management/translate_content/) in the back office. After adding a language be sure to dump all assets to the file system: ``` yarn encore @@ -178,6 +178,6 @@ If the `translation_siteaccesses` setting isn't provided, implicit *related S When setting up SiteAccesses with different language versions, you can specify a list of preset languages for each SiteAccess. When this SiteAccess is used, the system goes through this list. If a content item is unavailable in the first (prioritized) language, it attempts to use the next language in the list, and so on. Thanks to this you can have a fallback in case of a lacking translation. -You can also assign a Default content availability flag to content types (available in the Admin Panel). When this flag is assigned, content items of this type are available even when they do not have a language version in any of the languages configured for the current SiteAccess. +You can also assign a Default content availability flag to content types (available in the **Admin** panel). When this flag is assigned, content items of this type are available even when they do not have a language version in any of the languages configured for the current SiteAccess. If a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index 7654d8c5e9..363c92df5d 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -92,7 +92,7 @@ You do it by creating two new roles for a user group: Follow the example below to learn how to do that. **Cookbook**, **Dinner recipes** and **Dessert recipes** containers aren't accessible in the frontend. -Edit access to them in the **Admin Panel**. +Edit access to them in the **Admin** panel. ![Subtree file structure](subtree_usability_notes_1.png) diff --git a/docs/release_notes/ez_platform_v1.7.0_lts.md b/docs/release_notes/ez_platform_v1.7.0_lts.md index e1fc90c844..83ee966f74 100644 --- a/docs/release_notes/ez_platform_v1.7.0_lts.md +++ b/docs/release_notes/ez_platform_v1.7.0_lts.md @@ -32,7 +32,7 @@ Community members are more than welcome to contribute to the translation process ![](udwre.png) -- The Admin Panel now provides a way to get a clean **digest view of content types** configured in the system, with the ability to clearly get access to properties and field definitions. +- The **Admin** panel now provides a way to get a clean **digest view of content types** configured in the system, with the ability to clearly get access to properties and field definitions. ![](contenttypeviews.png) diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 315e705119..0c5491ba01 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -70,7 +70,7 @@ all features related to user management, such as user accounts, registering, cha ### Workflow improvements - You can now preview a diagram of the configured workflows in the Admin Panel. + You can now preview a diagram of the configured workflows in the **Admin** panel. ![Diagram of a workflow configuration](2.5_workflow_diagram.png) diff --git a/docs/release_notes/ez_platform_v3.1.md b/docs/release_notes/ez_platform_v3.1.md index 8aa9a118c6..35cca92347 100644 --- a/docs/release_notes/ez_platform_v3.1.md +++ b/docs/release_notes/ez_platform_v3.1.md @@ -70,7 +70,7 @@ You can create, modify or delete URL wildcards, and decide if the user should be !!! note - As of this release, the Link manager is no longer part of the Content panel, and now it belongs to the Admin panel of the back office. + As of this release, the Link manager is no longer part of the Content panel, and now it belongs to the **Admin** panel of the back office. ![URL Management UI](3_1_URL_Management.png "URL Management UI") diff --git a/docs/search/search_criteria_and_sort_clauses.md b/docs/search/search_criteria_and_sort_clauses.md index 7a92203ad4..165ef184e8 100644 --- a/docs/search/search_criteria_and_sort_clauses.md +++ b/docs/search/search_criteria_and_sort_clauses.md @@ -20,7 +20,7 @@ or [`ContentId` Criterion handler](https://github.com/ibexa/solr/blob/main/src/l ## Custom Criteria and Sort Clauses -Sometimes you can find that standard Search Criteria and Sort Clauses provided with [[= product_name =]] aren't sufficient for your needs. Most often this is the case if you have a custom field type using external storage which cannot be searched using the standard field Criterion. +Sometimes you can find that standard Search Criteria and Sort Clauses provided with [[= product_name =]] aren't sufficient for your needs. Most often this is the case if you have a custom field type using external storage which cannot be searched using the standard Field Criterion. !!!note diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index ff57a316bf..f102abe807 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -495,7 +495,7 @@ php bin/console assetic:dump --env=prod ##### Unstyled login screen after upgrade -It's possible that after the upgrade your admin screen is unstyled. This may happen because the new SiteAccess isn't available in the database. You can fix it by editing the permissions for the Anonymous user. Go to **Roles** in the Admin Panel and edit the limitations of the Anonymous user's `user/login` policy. Add all SiteAccesses to the limitation, save, and clear the browser cache. The login screen should now show proper styling. +It's possible that after the upgrade your admin screen is unstyled. This may happen because the new SiteAccess isn't available in the database. You can fix it by editing the permissions for the Anonymous user. Go to **Roles** in the **Admin** panel and edit the limitations of the Anonymous user's `user/login` policy. Add all SiteAccesses to the limitation, save, and clear the browser cache. The login screen should now show proper styling. ##### Translating URLs diff --git a/docs/users/user_management_guide.md b/docs/users/user_management_guide.md index 0512770383..03fa21ada1 100644 --- a/docs/users/user_management_guide.md +++ b/docs/users/user_management_guide.md @@ -19,7 +19,7 @@ User management is available in all [[= product_name =]] versions. ## How does user management work [[= product_name =]] simplifies user management with an intuitive and powerful system of accounts, Roles, Permissions, groups, and Segments. -You can find all user groups and users in the **Admin Panel** by selecting **Users**. +You can find all user groups and users in the **Admin** panel by selecting **Users**. Here, you can manage users, their relations, roles, and policies. ![User's section](users_section.png) From 6c158a13b6956b0096cc1b65aca9b6df37fd4c55 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 11:29:15 +0200 Subject: [PATCH 14/77] Fixes --- docs/administration/admin_panel/users_admin_panel.md | 2 +- docs/content_management/pages/create_custom_page_block.md | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/administration/admin_panel/users_admin_panel.md b/docs/administration/admin_panel/users_admin_panel.md index 3604f57a7b..60ba4141f6 100644 --- a/docs/administration/admin_panel/users_admin_panel.md +++ b/docs/administration/admin_panel/users_admin_panel.md @@ -6,7 +6,7 @@ description: You can access all users and user groups in the users tab. [Users](users.md) in [[= product_name =]] are treated the same way as content items. They're organized in groups such as *Guests*, *Editors*, *Anonymous*, which makes it easier to manage them and their permissions. -All user groups and users can be accessed in the Admin panel by selecting **Users**. +You can access all users and user groups in the **Admin** panel by selecting **Users**. ![Users and user groups](admin_panel_users.png "Users and user groups") diff --git a/docs/content_management/pages/create_custom_page_block.md b/docs/content_management/pages/create_custom_page_block.md index fdc0b28720..6198b6b987 100644 --- a/docs/content_management/pages/create_custom_page_block.md +++ b/docs/content_management/pages/create_custom_page_block.md @@ -132,5 +132,8 @@ The following UDW configuration is used so only an `event` typed content item ca For more information, see [UDW configuration](browser.md#udw-configuration). -Your custom page block is now ready. -Before you can use it in Page Builder, you must [enable it in Page field settings]([[= user_doc =]]/content_management/configure_ct_field_settings/#block-display). +Your custom page block is now ready. + +!!! caution + + Before you can use it in Page Builder, you must [enable it in Page field settings]([[= user_doc =]]/content_management/configure_ct_field_settings/#block-display). From 94f89b4e75f8ba7dcf1d4a1f828dd5e4fd5cf595 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 12:55:05 +0200 Subject: [PATCH 15/77] Fixes --- docs/cdp/cdp_data_customization.md | 2 +- docs/commerce/cart/cart.md | 2 +- docs/commerce/commerce.md | 48 +++++++++---------- .../data_migration/data_migration.md | 2 +- .../field_type_reference/imagefield.md | 2 +- docs/content_management/pages/pages.md | 2 +- docs/getting_started/getting_started.md | 2 +- docs/ibexa_cloud/ibexa_cloud.md | 6 +-- docs/ibexa_engage/ibexa_engage.md | 2 +- docs/ibexa_products/editions.md | 6 +-- .../cache/cache.md | 2 +- .../cache/persistence_cache.md | 10 ++-- .../infrastructure_and_maintenance.md | 2 +- .../security/security_checklist.md | 1 + .../sessions.md | 2 +- docs/multisite/multisite.md | 2 +- docs/multisite/siteaccess/siteaccess.md | 2 +- docs/permissions/permissions.md | 2 +- .../api_reference/api_reference.md | 2 +- docs/personalization/personalization.md | 2 +- docs/pim/pim.md | 2 +- docs/product_guides/product_guides.md | 20 ++++---- docs/release_notes/ez_platform_v2.3.md | 12 ++--- docs/release_notes/release_notes.md | 2 +- docs/resources/resources.md | 2 +- ...customize_elasticsearch_index_structure.md | 4 +- docs/search/search.md | 2 +- .../search_criteria_and_sort_clauses.md | 8 ++-- docs/templating/templating.md | 2 +- .../content_twig_functions.md | 2 +- .../twig_function_reference.md | 24 +++++----- docs/tutorials/tutorials.md | 2 +- .../from_4.3/update_from_4.3.md | 6 +-- docs/users/users.md | 20 ++++---- 34 files changed, 101 insertions(+), 108 deletions(-) diff --git a/docs/cdp/cdp_data_customization.md b/docs/cdp/cdp_data_customization.md index 25f722c89b..be0ff92c20 100644 --- a/docs/cdp/cdp_data_customization.md +++ b/docs/cdp/cdp_data_customization.md @@ -87,7 +87,7 @@ This Processor is a default one, as long as no other Processor with higher prior ​ This Processor generates JSON data from hash representation of the field type (it uses `\Ibexa\Contracts\Core\FieldType\FieldType::toHash` method). -!!! warning +!!! caution CDP doesn't support column mapping, which allows you to match records on JSON data directly. diff --git a/docs/commerce/cart/cart.md b/docs/commerce/cart/cart.md index 6d08175bca..6fb4b1fe4e 100644 --- a/docs/commerce/cart/cart.md +++ b/docs/commerce/cart/cart.md @@ -30,7 +30,7 @@ Information that relates to anonymous users is stored in the PHP session, while By default, anonymous users can add items to cart, but to display the cart view, they have to log in and transition into an authenticated user. -!!! note +!!! note For information about roles and permissions that control access to the cart, see [Permission use cases](permission_use_cases.md#commerce). diff --git a/docs/commerce/commerce.md b/docs/commerce/commerce.md index 1a15fc642a..7debfab0bf 100644 --- a/docs/commerce/commerce.md +++ b/docs/commerce/commerce.md @@ -9,43 +9,43 @@ page_type: landing_page The commerce component of [[= product_name =]] covers various areas of managing an e-commerce presence: from configuring payment and shipping methods, through processing a transaction (listing available products, adding products to a cart, processing checkout, and sending confirmation), all the way to order management. [[= cards([ -"commerce/cart/cart", -"commerce/checkout/checkout", -"commerce/order_management/order_management", -"commerce/payment/payment", -"commerce/shipping_management/shipping_management", -"commerce/storefront/storefront", -"commerce/transactional_emails/transactional_emails" + "commerce/cart/cart", + "commerce/checkout/checkout", + "commerce/order_management/order_management", + "commerce/payment/payment", + "commerce/shipping_management/shipping_management", + "commerce/storefront/storefront", + "commerce/transactional_emails/transactional_emails" ], columns=4) =]] ## Configure [[= cards([ -"commerce/checkout/configure_checkout", -"commerce/order_management/configure_order_management", -"commerce/payment/configure_payment", -"commerce/shipping_management/configure_shipment", -"commerce/storefront/configure_storefront" + "commerce/checkout/configure_checkout", + "commerce/order_management/configure_order_management", + "commerce/payment/configure_payment", + "commerce/shipping_management/configure_shipment", + "commerce/storefront/configure_storefront" ], columns=4) =]] ## Extend [[= cards([ -"commerce/checkout/customize_checkout", -"commerce/payment/extend_payment", -"commerce/shipping_management/extend_shipping", -"commerce/storefront/extend_storefront", -"commerce/transactional_emails/extend_transactional_emails" + "commerce/checkout/customize_checkout", + "commerce/payment/extend_payment", + "commerce/shipping_management/extend_shipping", + "commerce/storefront/extend_storefront", + "commerce/transactional_emails/extend_transactional_emails" ], columns=4) =]] ## Explore Commerce API [[= cards([ -"commerce/cart/cart_api", -"commerce/checkout/checkout_api", -"commerce/order_management/order_management_api", -"commerce/payment/payment_api", -"commerce/payment/payment_method_api", -"commerce/shipping_management/shipping_method_api", -"commerce/shipping_management/shipment_api" + "commerce/cart/cart_api", + "commerce/checkout/checkout_api", + "commerce/order_management/order_management_api", + "commerce/payment/payment_api", + "commerce/payment/payment_method_api", + "commerce/shipping_management/shipping_method_api", + "commerce/shipping_management/shipment_api" ], columns=4) =]] diff --git a/docs/content_management/data_migration/data_migration.md b/docs/content_management/data_migration/data_migration.md index 816194eede..1c41409fa4 100644 --- a/docs/content_management/data_migration/data_migration.md +++ b/docs/content_management/data_migration/data_migration.md @@ -22,5 +22,5 @@ You can run data migrations either with a command, or with the [PHP API](data_mi "content_management/data_migration/importing_data", "content_management/data_migration/exporting_data", "content_management/data_migration/data_migration_actions", - "content_management/data_migration/managing_migrations", + "content_management/data_migration/managing_migrations" ]) =]] diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index a8f9ef003c..7197585793 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -65,7 +65,7 @@ Using the variation Service, variations of the original image can be obtained. t The Image field type supports one `FieldDefinition` option: the maximum size for the file. -!!!note +!!! note Maximum size is rounded to 1 MB (legacy storage limitation). diff --git a/docs/content_management/pages/pages.md b/docs/content_management/pages/pages.md index e82d0052c4..d861a86c80 100644 --- a/docs/content_management/pages/pages.md +++ b/docs/content_management/pages/pages.md @@ -12,5 +12,5 @@ Pages are block-based special types of content that editors can create and modif "content_management/pages/page_blocks", "content_management/pages/page_block_attributes", "content_management/pages/page_block_validators", - "content_management/pages/create_custom_page_block", + "content_management/pages/create_custom_page_block" ], columns=3) =]] diff --git a/docs/getting_started/getting_started.md b/docs/getting_started/getting_started.md index 67e89c4cd3..b7b018fd16 100644 --- a/docs/getting_started/getting_started.md +++ b/docs/getting_started/getting_started.md @@ -10,5 +10,5 @@ To get started working with [[= product_name =]], see how you can get an install [[= cards([ "getting_started/requirements", "getting_started/install_ibexa_dxp", - "getting_started/first_steps", + "getting_started/first_steps" ], columns=3) =]] diff --git a/docs/ibexa_cloud/ibexa_cloud.md b/docs/ibexa_cloud/ibexa_cloud.md index 749f96ac26..21f24843a0 100644 --- a/docs/ibexa_cloud/ibexa_cloud.md +++ b/docs/ibexa_cloud/ibexa_cloud.md @@ -9,7 +9,7 @@ month_change: false [[= product_name_cloud =]] is a cloud hosting platform that enables you to host your application in the cloud using the Platform.sh service. [[= cards([ -"ibexa_cloud/ibexa_cloud_guide", -"ibexa_cloud/install_on_ibexa_cloud", -"ibexa_cloud/ddev_and_ibexa_cloud", + "ibexa_cloud/ibexa_cloud_guide", + "ibexa_cloud/install_on_ibexa_cloud", + "ibexa_cloud/ddev_and_ibexa_cloud" ], columns=3) =]] diff --git a/docs/ibexa_engage/ibexa_engage.md b/docs/ibexa_engage/ibexa_engage.md index 7b14a7704a..a48086f36e 100644 --- a/docs/ibexa_engage/ibexa_engage.md +++ b/docs/ibexa_engage/ibexa_engage.md @@ -13,5 +13,5 @@ You can also integrate [[= product_name_engage =]] with [[= product_name_connect [[= cards([ "ibexa_engage/install_ibexa_engage", "ibexa_engage/create_campaign", - "ibexa_engage/integrate_ibexa_connect", + "ibexa_engage/integrate_ibexa_connect" ], columns=3) =]] diff --git a/docs/ibexa_products/editions.md b/docs/ibexa_products/editions.md index 8fe28003a8..e610984a8e 100644 --- a/docs/ibexa_products/editions.md +++ b/docs/ibexa_products/editions.md @@ -8,9 +8,9 @@ page_type: landing_page Three [[= product_name =]] product editions are available to help you accelerate your digital transformation at the speed and cost that work best for you. [[= cards([ -"ibexa_products/ibexa_headless", -"ibexa_products/ibexa_experience", -"ibexa_products/ibexa_commerce" + "ibexa_products/ibexa_headless", + "ibexa_products/ibexa_experience", + "ibexa_products/ibexa_commerce" ], columns=3) =]] ## Feature comparison diff --git a/docs/infrastructure_and_maintenance/cache/cache.md b/docs/infrastructure_and_maintenance/cache/cache.md index 0ca8bf13cd..939ad7c745 100644 --- a/docs/infrastructure_and_maintenance/cache/cache.md +++ b/docs/infrastructure_and_maintenance/cache/cache.md @@ -10,5 +10,5 @@ page_type: landing_page [[= cards([ "infrastructure_and_maintenance/cache/http_cache/http_cache", "infrastructure_and_maintenance/cache/http_cache/reverse_proxy", - "infrastructure_and_maintenance/cache/persistence_cache", + "infrastructure_and_maintenance/cache/persistence_cache" ], columns=3) =]] diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 894651849e..0a8b7a210d 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -158,7 +158,7 @@ Depending on the number of lookups and latency to cache server this might affect Out of the box in `config/packages/cache_pool/cache.redis.yaml` you'll find a default example that can be used. -!!! note "Ibexa Cloud" +!!! note "[[= product_name_cloud =]]" For Ibexa Cloud/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Redis as `rediscache` Platform.sh service. @@ -207,9 +207,9 @@ Several cloud providers have managed services that are easier to set up, handle - [Azure Redis Cache](https://azure.microsoft.com/en-us/products/cache/) - [Google Cloud Memorystore](https://cloud.google.com/memorystore/) -###### Ibexa Cloud / Platform.sh usage +###### [[= product_name_cloud =]] / Platform.sh usage -!!! note "Ibexa Cloud" +!!! note "[[= product_name_cloud =]]" If you use Platform.sh Enterprise you can benefit from the Redis Sentinel across three nodes for great fault tolerance. Platform.sh Professional and lower versions offer Redis in single instance mode only. @@ -236,9 +236,9 @@ There is one Memcached adapter available out of the box. Out of the box in `config/packages/cache_pool/cache.memcached.yaml` you'll find a default example that can be used. -!!! note "Ibexa Cloud" +!!! note "[[= product_name_cloud =]]" - For Ibexa Cloud/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Memcached as `cache` Platform.sh service. + For [[= product_name_cloud =]]/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Memcached as `cache` Platform.sh service. For anything else, you can enable it with environment variables detected automatically by `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php`. For instance, if you set the following environment variables `export CACHE_POOL="cache.memcached" CACHE_DSN="user:pass@localhost?weight=33"`, it results in config like this: diff --git a/docs/infrastructure_and_maintenance/infrastructure_and_maintenance.md b/docs/infrastructure_and_maintenance/infrastructure_and_maintenance.md index e78c231344..611be02702 100644 --- a/docs/infrastructure_and_maintenance/infrastructure_and_maintenance.md +++ b/docs/infrastructure_and_maintenance/infrastructure_and_maintenance.md @@ -11,5 +11,5 @@ page_type: landing_page "infrastructure_and_maintenance/performance", "infrastructure_and_maintenance/databases", "infrastructure_and_maintenance/environments", - "infrastructure_and_maintenance/support_and_maintenance_faq", + "infrastructure_and_maintenance/support_and_maintenance_faq" ], columns=3) =]] diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index f081addb83..443fc5a0f5 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -197,6 +197,7 @@ Security should be a multi-layered exercise. It's wise to minimize what features - The REST API endpoints !!! tip "Access control" + One way to lock down an endpoint that should not be openly available is to restrict access to logged-in users, by using the [`access_control`]([[= symfony_doc =]]/security/access_control.html) feature. In your YAML configuration, under the `security` key, add an entry similar to the following one, which redirects requests to a login page: ```yaml diff --git a/docs/infrastructure_and_maintenance/sessions.md b/docs/infrastructure_and_maintenance/sessions.md index 234dfd0417..df25a9d677 100644 --- a/docs/infrastructure_and_maintenance/sessions.md +++ b/docs/infrastructure_and_maintenance/sessions.md @@ -117,7 +117,7 @@ Alternatively if you have needs to configure Redis servers dynamically: - Set `%ibexa.session.handler_id%` (or `SESSION_HANDLER_ID` env var) to `Ibexa\Bundle\Core\Session\Handler\NativeSessionHandler` - Set `%ibexa.session.save_path%` (or `SESSION_SAVE_PATH` env var) to [save_path config for Redis](https://github.com/phpredis/phpredis/#php-session-handler) -!!! note "Ibexa Cloud" +!!! note "[[= product_name_cloud =]]" For [[= product_name_cloud =]] (and Platform.sh), this is already configured in `config/env/platformsh.php` based on `.platform.yaml` config. diff --git a/docs/multisite/multisite.md b/docs/multisite/multisite.md index e9e49103fb..c39960bead 100644 --- a/docs/multisite/multisite.md +++ b/docs/multisite/multisite.md @@ -18,5 +18,5 @@ To quickly set up new sites with predefined site templates, use [Site Factory](s "multisite/set_up_translation_siteaccess", "multisite/multisite_configuration", "multisite/site_factory/site_factory", - "multisite/site_factory/site_factory_configuration", + "multisite/site_factory/site_factory_configuration" ], columns=3) =]] diff --git a/docs/multisite/siteaccess/siteaccess.md b/docs/multisite/siteaccess/siteaccess.md index a4e8d747e5..5e634770e6 100644 --- a/docs/multisite/siteaccess/siteaccess.md +++ b/docs/multisite/siteaccess/siteaccess.md @@ -27,5 +27,5 @@ Many other settings in the application are also configured per SiteAccess (also [[= cards([ "multisite/siteaccess/siteaccess_matching", "multisite/siteaccess/siteaccess_aware_configuration", - "multisite/siteaccess/injecting_siteaccess", + "multisite/siteaccess/injecting_siteaccess" ], columns=3) =]] diff --git a/docs/permissions/permissions.md b/docs/permissions/permissions.md index 9adc744eac..2a9fb2ffb1 100644 --- a/docs/permissions/permissions.md +++ b/docs/permissions/permissions.md @@ -11,6 +11,6 @@ The permission system of [[= product_name =]] enables you to control in detail w "permissions/permission_overview", "permissions/policies", "permissions/permission_use_cases", - "permissions/limitations", + "permissions/limitations" ], columns=4) =]] diff --git a/docs/personalization/api_reference/api_reference.md b/docs/personalization/api_reference/api_reference.md index 7910d07941..26d349b7f7 100644 --- a/docs/personalization/api_reference/api_reference.md +++ b/docs/personalization/api_reference/api_reference.md @@ -11,5 +11,5 @@ This section provides documentation for the Personalization API operations. "personalization/api_reference/tracking_api", "personalization/api_reference/content_api", "personalization/api_reference/recommendation_api", - "personalization/api_reference/user_api", + "personalization/api_reference/user_api" ], columns=4) =]] diff --git a/docs/personalization/personalization.md b/docs/personalization/personalization.md index c491f121c1..f5e3be3e88 100644 --- a/docs/personalization/personalization.md +++ b/docs/personalization/personalization.md @@ -22,7 +22,7 @@ To provide online recommendations, the service must at least: "personalization/how_it_works", "personalization/enable_personalization", "personalization/integrate_recommendation_service", - "personalization/api_reference/api_reference", + "personalization/api_reference/api_reference" ], columns=3) =]] diff --git a/docs/pim/pim.md b/docs/pim/pim.md index 2fd55d49f9..348a34d22d 100644 --- a/docs/pim/pim.md +++ b/docs/pim/pim.md @@ -13,5 +13,5 @@ including their specifications and pricing. "pim/products", "pim/catalogs", "pim/pim_configuration", - "pim/prices", + "pim/prices" ], columns=3) =]] diff --git a/docs/product_guides/product_guides.md b/docs/product_guides/product_guides.md index 01cb96c4d5..0170535db7 100644 --- a/docs/product_guides/product_guides.md +++ b/docs/product_guides/product_guides.md @@ -10,14 +10,14 @@ month_change: true Discover the primary ones with the help of product guides. Condensed content allows you to quickly learn about their availability, capabilities, and benefits. [[= cards([ -"users/user_management_guide", -"content_management/content_management_guide", -"content_management/rich_text/online_editor_guide", -"content_management/pages/page_builder_guide", -"content_management/forms/form_builder_guide", -"customer_management/customer_portal", -"personalization/personalization_guide", -"pim/pim_guide", -"ibexa_cloud/ibexa_cloud_guide", -"cdp/cdp_guide" + "users/user_management_guide", + "content_management/content_management_guide", + "content_management/rich_text/online_editor_guide", + "content_management/pages/page_builder_guide", + "content_management/forms/form_builder_guide", + "customer_management/customer_portal", + "personalization/personalization_guide", + "pim/pim_guide", + "ibexa_cloud/ibexa_cloud_guide", + "cdp/cdp_guide" ], columns=4) =]] diff --git a/docs/release_notes/ez_platform_v2.3.md b/docs/release_notes/ez_platform_v2.3.md index 40e0236e43..f5adf40815 100644 --- a/docs/release_notes/ez_platform_v2.3.md +++ b/docs/release_notes/ez_platform_v2.3.md @@ -12,7 +12,7 @@ ### Content scheduling -!!! dxp +!!! note You can now schedule content on a Page to become visible at a specific time in the future. @@ -33,13 +33,11 @@ The timeline also shows other events, such a Content published using the date-based publisher. - !!! tip "User documentation" - - You can also check user documentation on [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options) +For more information, check [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options) in User Documentation. ### Form Builder -!!! dxp +!!! note The new Form Builder enables you to create Form content items with multiple form fields. @@ -51,9 +49,7 @@ See [Extending Form Builder](https://doc.ibexa.co/en/2.5/guide/extending/extending_form_builder) for information on how to modify and create Form fields. - !!! tip "User documentation" - - You can also check user documentation on [forms](https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms) +Fore more information, check [forms](https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms) in User Documentation. ### ImageAsset field type diff --git a/docs/release_notes/release_notes.md b/docs/release_notes/release_notes.md index 45189ce2d1..39d186da98 100644 --- a/docs/release_notes/release_notes.md +++ b/docs/release_notes/release_notes.md @@ -12,5 +12,5 @@ The latest stable and LTS (Long Term Support) version of [[= product_name =]] is "release_notes/ibexa_dxp_v4.6", "release_notes/ibexa_dxp_v4.5", "release_notes/ibexa_dxp_v3.3", - "release_notes/ez_platform_v2.5", + "release_notes/ez_platform_v2.5" ], columns=4) =]] diff --git a/docs/resources/resources.md b/docs/resources/resources.md index 18993c0d5d..e583db0813 100644 --- a/docs/resources/resources.md +++ b/docs/resources/resources.md @@ -11,5 +11,5 @@ helpful tools, and learn how you can contribute to the creation of the platform. [[= cards([ "resources/release_process_and_roadmap", "resources/phpstorm_plugin", - "resources/contributing/report_and_follow_issues", + "resources/contributing/report_and_follow_issues" ], columns=3) =]] diff --git a/docs/search/extensibility/customize_elasticsearch_index_structure.md b/docs/search/extensibility/customize_elasticsearch_index_structure.md index 03d27e204d..f6a3091d31 100644 --- a/docs/search/extensibility/customize_elasticsearch_index_structure.md +++ b/docs/search/extensibility/customize_elasticsearch_index_structure.md @@ -11,9 +11,7 @@ This lets you control the size of [Elasticsearch shards](https://www.elastic.co/ By customizing the structure to your needs, you can avoid "oversharding" (having too many shards), which negatively affects performance and can lead to instability. -!!! tip "Sizing Elasticsearch shards" - - See [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/8.4/size-your-shards.html) for more information about adapting the size of your search index shards. +For more information about adapting the size of your search index shards, see [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/8.4/size-your-shards.html). ## Selecting indexing strategy diff --git a/docs/search/search.md b/docs/search/search.md index c0162d2ca2..4abcb4f656 100644 --- a/docs/search/search.md +++ b/docs/search/search.md @@ -15,5 +15,5 @@ page_type: landing_page "search/search_criteria_and_sort_clauses", "search/extensibility/create_custom_search_criterion", "search/extensibility/create_custom_sort_clause", - "search/extensibility/create_custom_aggregation", + "search/extensibility/create_custom_aggregation" ], columns=4) =]] diff --git a/docs/search/search_criteria_and_sort_clauses.md b/docs/search/search_criteria_and_sort_clauses.md index 165ef184e8..57adec1227 100644 --- a/docs/search/search_criteria_and_sort_clauses.md +++ b/docs/search/search_criteria_and_sort_clauses.md @@ -22,7 +22,7 @@ or [`ContentId` Criterion handler](https://github.com/ibexa/solr/blob/main/src/l Sometimes you can find that standard Search Criteria and Sort Clauses provided with [[= product_name =]] aren't sufficient for your needs. Most often this is the case if you have a custom field type using external storage which cannot be searched using the standard Field Criterion. -!!!note +!!! note Legacy (SQL-based) search can also be used in `ezkeyword` external storage. @@ -104,10 +104,8 @@ Ibexa\Core\Search\Legacy\Content\Location\Gateway\SortClauseHandler\Location\Dep tags: - {name: ibexa.search.legacy.gateway.sort_clause_handler.location} ``` - -!!! note "See also" - - For more information about passing parameters, see [Symfony Service Container documentation]([[= symfony_doc =]]/book/service_container.html#service-parameters). + +For more information about passing parameters, see [Symfony Service Container documentation]([[= symfony_doc =]]/book/service_container.html#service-parameters). ## Search using custom Field Criterion [REST] diff --git a/docs/templating/templating.md b/docs/templating/templating.md index 963f9468aa..12dab1b679 100644 --- a/docs/templating/templating.md +++ b/docs/templating/templating.md @@ -17,5 +17,5 @@ Content view configuration is SiteAccess-aware. "templating/templates/templates", "templating/queries_and_controllers/content_queries", "templating/twig_function_reference/twig_function_reference", - "templating/design_engine/design_engine", + "templating/design_engine/design_engine" ], columns=4) =]] diff --git a/docs/templating/twig_function_reference/content_twig_functions.md b/docs/templating/twig_function_reference/content_twig_functions.md index 421d83e5f7..22594451c5 100644 --- a/docs/templating/twig_function_reference/content_twig_functions.md +++ b/docs/templating/twig_function_reference/content_twig_functions.md @@ -97,7 +97,7 @@ data to the content item's HTML code. {{ ibexa_seo(content) }} ``` -!!! tip +!!! tip The following example uses both SEO-related functions: diff --git a/docs/templating/twig_function_reference/twig_function_reference.md b/docs/templating/twig_function_reference/twig_function_reference.md index a38b5dddd6..091a42af92 100644 --- a/docs/templating/twig_function_reference/twig_function_reference.md +++ b/docs/templating/twig_function_reference/twig_function_reference.md @@ -10,16 +10,16 @@ and [Twig extensions provided by Symfony]([[= symfony_doc =]]/reference/twig_ref [[= product_name =]] offers the following custom Twig functions and filters: [[= cards([ - "templating/twig_function_reference/cart_twig_functions", - "templating/twig_function_reference/catalog_twig_functions", - "templating/twig_function_reference/checkout_twig_functions", - "templating/twig_function_reference/content_twig_functions", - "templating/twig_function_reference/field_twig_functions", - "templating/twig_function_reference/product_twig_functions", - "templating/twig_function_reference/site_context_twig_functions", - "templating/twig_function_reference/storefront_twig_functions", - "templating/twig_function_reference/image_twig_functions", - "templating/twig_function_reference/url_twig_functions", - "templating/twig_function_reference/date_twig_filters", - "templating/twig_function_reference/other_twig_filters" + "templating/twig_function_reference/cart_twig_functions", + "templating/twig_function_reference/catalog_twig_functions", + "templating/twig_function_reference/checkout_twig_functions", + "templating/twig_function_reference/content_twig_functions", + "templating/twig_function_reference/field_twig_functions", + "templating/twig_function_reference/product_twig_functions", + "templating/twig_function_reference/site_context_twig_functions", + "templating/twig_function_reference/storefront_twig_functions", + "templating/twig_function_reference/image_twig_functions", + "templating/twig_function_reference/url_twig_functions", + "templating/twig_function_reference/date_twig_filters", + "templating/twig_function_reference/other_twig_filters" ], columns=4) =]] diff --git a/docs/tutorials/tutorials.md b/docs/tutorials/tutorials.md index 3711d5cc8b..9980883911 100644 --- a/docs/tutorials/tutorials.md +++ b/docs/tutorials/tutorials.md @@ -10,5 +10,5 @@ Get started with tutorials to learn how to create a site with [[= product_name = [[= cards([ "tutorials/beginner_tutorial/beginner_tutorial", "tutorials/page_and_form_tutorial/page_and_form_tutorial", - "tutorials/generic_field_type/creating_a_point2d_field_type", + "tutorials/generic_field_type/creating_a_point2d_field_type" ], columns=3) =]] diff --git a/docs/update_and_migration/from_4.3/update_from_4.3.md b/docs/update_and_migration/from_4.3/update_from_4.3.md index dbc2b03471..10ef903ab7 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3.md @@ -17,6 +17,6 @@ A. If you do not use Commerce functionalities, you can proceed with removing the B. If you use Commerce functionalities based on the deprecated packages, you can continue to use them for the time being. [[= cards([ -"update_and_migration/from_4.3/update_from_4.3_new_commerce", -"update_and_migration/from_4.3/update_from_4.3_old_commerce", -],) =]] + "update_and_migration/from_4.3/update_from_4.3_new_commerce", + "update_and_migration/from_4.3/update_from_4.3_old_commerce" +], columns=2) =]] diff --git a/docs/users/users.md b/docs/users/users.md index 2e0fadcbf9..f5cf37ba11 100644 --- a/docs/users/users.md +++ b/docs/users/users.md @@ -12,24 +12,24 @@ All such user accounts have the same underlying mechanism and enable you to cont ## Invite nad manage users [[= cards([ -"users/user_management_guide", -"users/invitations", -"users/user_registration", + "users/user_management_guide", + "users/invitations", + "users/user_registration" ], columns=3) =]] ## Authenticate users [[= cards([ -"users/login_methods", -"users/passwords", -"users/user_authentication", -"users/oauth_client", -"users/oauth_server", + "users/login_methods", + "users/passwords", + "users/user_authentication", + "users/oauth_client", + "users/oauth_server" ], columns=5) =]] ## Group users [[= cards([ -"users/customer_groups", -"users/segment_api", + "users/customer_groups", + "users/segment_api" ], columns=2) =]] From 28c7a8f60ec0ac98131962aaa64ba4626fed34df Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 13:10:23 +0200 Subject: [PATCH 16/77] Variables fix --- docs/content_management/images/fastly_io.md | 2 +- .../content_management/rich_text/rich_text.md | 2 +- docs/getting_started/install_ibexa_dxp.md | 2 +- docs/getting_started/requirements.md | 98 +++++++++---------- docs/ibexa_products/editions.md | 2 +- docs/ibexa_products/ibexa_commerce.md | 2 +- docs/ibexa_products/ibexa_experience.md | 2 +- docs/ibexa_products/ibexa_headless.md | 2 +- .../cache/http_cache/reverse_proxy.md | 4 +- .../security/reporting_issues.md | 2 +- docs/release_notes/ibexa_dxp_v3.2.md | 2 +- docs/release_notes/ibexa_dxp_v3.3.md | 2 +- docs/release_notes/ibexa_dxp_v4.0.md | 2 +- .../ibexa_dxp_v4.0_deprecations.md | 2 +- docs/release_notes/ibexa_dxp_v4.1.md | 2 +- docs/release_notes/ibexa_dxp_v4.2.md | 2 +- docs/release_notes/ibexa_dxp_v4.3.md | 2 +- docs/release_notes/ibexa_dxp_v4.4.md | 6 +- docs/release_notes/ibexa_dxp_v4.5.md | 2 +- docs/release_notes/ibexa_dxp_v4.6.md | 10 +- docs/release_notes/release_notes.md | 2 +- docs/resources/new_in_doc.md | 2 +- docs/resources/phpstorm_plugin.md | 20 ++-- docs/resources/release_process_and_roadmap.md | 2 +- .../beginner_tutorial/1_get_ready.md | 2 +- .../1_implement_the_point2d_value_class.md | 2 +- .../from_3.3/update_from_3.3.md | 2 +- .../from_4.3/update_from_4.3_old_commerce.md | 2 +- docs/update_and_migration/update_ibexa_dxp.md | 2 +- 29 files changed, 93 insertions(+), 93 deletions(-) diff --git a/docs/content_management/images/fastly_io.md b/docs/content_management/images/fastly_io.md index 4ec1bcf606..959c4891a9 100644 --- a/docs/content_management/images/fastly_io.md +++ b/docs/content_management/images/fastly_io.md @@ -11,7 +11,7 @@ To be able to configure this feature, you need [Fastly IO subscription](https:// ## Enable shielding -To use Fastly Image Optimizer, you first need a [working setup of Ibexa DXP and Fastly](reverse_proxy.md#using-varnish-or-fastly) +To use Fastly Image Optimizer, you first need a [working setup of [[= product_name =]] and Fastly](reverse_proxy.md#using-varnish-or-fastly) with shielding enabled. To enable shielding, follow the steps in [Fastly developer documentation](https://developer.fastly.com/learning/concepts/shielding/#enabling-and-disabling-shielding). Remember to choose a shield location from the **Shielding** menu, as described in [Fastly user documentation](https://docs.fastly.com/en/guides/shielding#enabling-shielding). diff --git a/docs/content_management/rich_text/rich_text.md b/docs/content_management/rich_text/rich_text.md index 3024c2e56d..5319ba4bed 100644 --- a/docs/content_management/rich_text/rich_text.md +++ b/docs/content_management/rich_text/rich_text.md @@ -5,7 +5,7 @@ page_type: landing_page # RichText -RichText is a type of field that you add in any content item in Ibexa DXP and edit in Online Editor. +RichText is a type of field that you add in any content item in [[= product_name =]] and edit in Online Editor. [[= cards([ "content_management/rich_text/online_editor_guide", diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md index e305d82e1d..90b22f389d 100644 --- a/docs/getting_started/install_ibexa_dxp.md +++ b/docs/getting_started/install_ibexa_dxp.md @@ -2,7 +2,7 @@ description: Install Ibexa DXP on a Linux system and prepare your installation for production. --- -# Install Ibexa DXP +# Install [[= product_name =]] !!! note diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index 421767ebc6..15aa503e90 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -7,7 +7,7 @@ description: System, component and package requirements for running Ibexa DXP. # Requirements This document covers all supported versions of the product. -To review the requirements, select the specific version of Ibexa DXP you're interested in. +To review the requirements, select the specific version of [[= product_name =]] you're interested in. The following server requirements cover both running the software on-premise and on third-party PaaS providers. @@ -26,7 +26,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Operating system -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" |Name|Version| |---|---| @@ -38,7 +38,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" |Name|Version| |---|---| @@ -62,7 +62,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Web server -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - Nginx 1.18-1.25+ - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; @@ -70,7 +70,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - Nginx 1.18 - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; @@ -84,7 +84,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## DBMS -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - MariaDB 10.3-10.11+ - MySQL 8.0 @@ -92,7 +92,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - MariaDB 10.3, 10.4 (optionally 10.2 - deprecated) - MySQL 8.0 (optionally 5.7 - deprecated) @@ -110,7 +110,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## PHP -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - 8.3 - 8.2 @@ -118,7 +118,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - 8.0 (PHP 8.0 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should use PHP 8.1) - 7.4 (PHP 7.4 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should use PHP 8.1) -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - 8.3 - 8.2 @@ -129,14 +129,14 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "eZ Platform v2.5" - - 7.1 (PHP 7.1 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to Ibexa DXP v3.3 or v4.x) - - 7.2 (PHP 7.2 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to Ibexa DXP v3.3 or v4.x) - - 7.3 (PHP 7.3 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to Ibexa DXP v3.3 or v4.x) - - 7.4 (PHP 7.4 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to Ibexa DXP v3.3 or v4.x) + - 7.1 (PHP 7.1 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) + - 7.2 (PHP 7.2 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]]P v3.3 or v4.x) + - 7.3 (PHP 7.3 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) + - 7.4 (PHP 7.4 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) ### PHP extensions -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - `php-cli` - `php-fpm` @@ -152,7 +152,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - `php-sodium` - `php-bcmath` -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - `php-cli` - `php-fpm` @@ -183,11 +183,11 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Cluster PHP extensions -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - `php-redis` or `php-memcached` -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - `php-redis` or `php-memcached` @@ -199,12 +199,12 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Search -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - For BinaryFile field indexing, Apache Tika 1.20 or higher 1.x version, recommended 1.28.1 or higher. @@ -218,7 +218,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Graphic Handler -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - GraphicsMagick - ImageMagick @@ -233,7 +233,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Gifsicle - cwebp -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - GraphicsMagick - ImageMagick @@ -256,7 +256,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## [Clustering](clustering.md) -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) - Redis 4.0+, 5.0 or higher (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher @@ -264,7 +264,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) - Redis 4.0+, 5.0 or higher (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher @@ -282,11 +282,11 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Filesystem -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - Linux ext4 / XFS -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - Linux ext4 / XFS @@ -296,11 +296,11 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Package manager -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - Composer: recent 2.7 version -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - Composer: recent 2.1 version @@ -310,14 +310,14 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Asset manager -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - `Node.js` 18+ - `yarn` 1.15.2+ If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - `Node.js` 14+, 16+, 18+ (`Node.js` 14+ has reached its End of Life. We strongly recommend using a newer version to ensure you receive security updates.) - `yarn` 1.15.2+ @@ -333,18 +333,18 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ## Browser -=== "Ibexa DXP v4.6" +=== "[[= product_name =]] v4.6" - Ibexa DXP is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) - Chromium™ based browsers such as Microsoft® Edge® and Opera®, most recent stable version, desktop *and* tablet - Apple® Safari® most recent stable version, desktop *and* tablet -=== "Ibexa DXP v3.3" +=== "[[= product_name =]] v3.3" - Ibexa DXP is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -366,17 +366,17 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Cloud hosting with Ibexa Cloud and Platform.sh - In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the Ibexa DXP version you use. + In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. Ibexa DXP supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. - Features or services supported by Ibexa DXP but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). + Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). ### Ibexa Cloud Setup support matrix - All Ibexa DXP features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. + All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. !!! note @@ -391,21 +391,21 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Supported Ibexa Cloud setup - Because of the large range of possible configurations of Ibexa DXP, there are many possibilities beyond what is provided in the default recommended configuration. + Because of the large range of possible configurations of [[= product_name =]], there are many possibilities beyond what is provided in the default recommended configuration. Make sure to set aside time and budget for: - Verifying your requirements and ensuring they're supported by Platform.sh - Additional time for adaptation and configuration work, and testing by your development team - - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with Ibexa DXP + - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with [[= product_name =]] The cost and effort of this isn't included in Ibexa Cloud subscription and is vary depending on the project. ### Custom integrations - Features supported by Ibexa DXP, but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. + Features supported by [[= product_name =]], but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. - For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of Ibexa DXP. + For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of [[= product_name =]]. We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. @@ -413,17 +413,17 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Cloud hosting with Ibexa Cloud and Platform.sh - In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the Ibexa DXP version you use. + In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. Ibexa DXP supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. - Features or services supported by Ibexa DXP but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). + Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). ### Ibexa Cloud Setup support matrix - All Ibexa DXP features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. + All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. !!! note @@ -438,21 +438,21 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Supported Ibexa Cloud setup - Because of the large range of possible configurations of Ibexa DXP, there are many possibilities beyond what is provided in the default recommended configuration. + Because of the large range of possible configurations of [[= product_name =]], there are many possibilities beyond what is provided in the default recommended configuration. Make sure to set aside time and budget for: - Verifying your requirements and ensuring they're supported by Platform.sh - Additional time for adaptation and configuration work, and testing by your development team - - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with Ibexa DXP + - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with [[= product_name =]] The cost and effort of this isn't included in Ibexa Cloud subscription and is vary depending on the project. ### Custom integrations - Features supported by Ibexa DXP, but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. + Features supported by [[= product_name =]], but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. - For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of Ibexa DXP. + For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of [[= product_name =]]. We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. diff --git a/docs/ibexa_products/editions.md b/docs/ibexa_products/editions.md index e610984a8e..f23b56d9a7 100644 --- a/docs/ibexa_products/editions.md +++ b/docs/ibexa_products/editions.md @@ -3,7 +3,7 @@ description: Learn more about various Ibexa DXP editions' features to help yours page_type: landing_page --- -# Ibexa DXP editions +# [[= product_name =]] editions Three [[= product_name =]] product editions are available to help you accelerate your digital transformation at the speed and cost that work best for you. diff --git a/docs/ibexa_products/ibexa_commerce.md b/docs/ibexa_products/ibexa_commerce.md index b4b35679ab..af76988d45 100644 --- a/docs/ibexa_products/ibexa_commerce.md +++ b/docs/ibexa_products/ibexa_commerce.md @@ -4,7 +4,7 @@ description: Explore all of the key features, functionalities, and advantages of month_change: true --- -# Ibexa DXP Commerce edition product guide +# [[= product_name_com =]] edition product guide ## What is [[= product_name_com =]] diff --git a/docs/ibexa_products/ibexa_experience.md b/docs/ibexa_products/ibexa_experience.md index 26bad17a35..321ec21b00 100644 --- a/docs/ibexa_products/ibexa_experience.md +++ b/docs/ibexa_products/ibexa_experience.md @@ -4,7 +4,7 @@ description: Learn about all the main attributes, features, and benefits of the month_change: true --- -# Ibexa DXP Experience edition product guide +# [[= product_name_exp =]] edition product guide ## What is [[= product_name_exp =]] diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md index 89f4fbed80..18a6aaeb18 100644 --- a/docs/ibexa_products/ibexa_headless.md +++ b/docs/ibexa_products/ibexa_headless.md @@ -3,7 +3,7 @@ title: Ibexa Headless description: Get to know Ibexa Headless - an edition that focuses on content management. --- -# Ibexa DXP Headless edition product guide +# [[= product_name_headless =]] edition product guide ## What is [[= product_name_headless =]] diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md index d57ac1335c..964c68b7d6 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md @@ -58,7 +58,7 @@ If you decide to use Fastly VCL, consider using [Fastly CLI](https://developer.f To learn more, see [Prepare to use Fastly locally](fastly.md#prepare-for-using-fastly-locally) and [Introduction to Fastly CLI](fastly.md#quick-introduction-to-fastly-cli). !!! tip - Support for Fastly Shielding was added in Ibexa DXP v3.3.24 and v4.1.6 + Support for Fastly Shielding was added in [[= product_name =]] v3.3.24 and v4.1.6 When you extend [FOSHttpCacheBundle](https://foshttpcachebundle.readthedocs.io/en/latest/), you can also adapt your VCL further with [FOSHttpCache documentation](https://foshttpcache.readthedocs.io/en/latest/varnish-configuration.html) @@ -107,7 +107,7 @@ When using Fastly, you need to set `trusted_proxies` according to the [IP ranges You don't have to set `trusted_proxies` when using Fastly on Platform.sh. The Platform.sh router automatically changes the source IP of requests coming from Fastly, - replacing the source IP with the actual client IP and removing any `X-FORWARD-...` header in the request before it reaches Ibexa DXP. + replacing the source IP with the actual client IP and removing any `X-FORWARD-...` header in the request before it reaches [[= product_name =]]. For more information about setting these variables, see [Configuration examples](#configuration-examples). diff --git a/docs/infrastructure_and_maintenance/security/reporting_issues.md b/docs/infrastructure_and_maintenance/security/reporting_issues.md index e7e7decfb5..bb66751cbd 100644 --- a/docs/infrastructure_and_maintenance/security/reporting_issues.md +++ b/docs/infrastructure_and_maintenance/security/reporting_issues.md @@ -1,5 +1,5 @@ --- -description: How to report security issues in Ibexa DXP? +description: Learn how to report security issues in Ibexa DXP. --- # Reporting security issues in Ibexa products diff --git a/docs/release_notes/ibexa_dxp_v3.2.md b/docs/release_notes/ibexa_dxp_v3.2.md index 319a06c776..d757720ba4 100644 --- a/docs/release_notes/ibexa_dxp_v3.2.md +++ b/docs/release_notes/ibexa_dxp_v3.2.md @@ -1,6 +1,6 @@ -# Ibexa DXP v3.2 +# [[= product_name =]] v3.2 **Version number**: v3.2 diff --git a/docs/release_notes/ibexa_dxp_v3.3.md b/docs/release_notes/ibexa_dxp_v3.3.md index 33ae9b648e..b16bb78bfc 100644 --- a/docs/release_notes/ibexa_dxp_v3.3.md +++ b/docs/release_notes/ibexa_dxp_v3.3.md @@ -4,7 +4,7 @@ description: Ibexa DXP v3.3 is a Long Term Support release that offers a new Per -# Ibexa DXP v3.3 +# [[= product_name =]] v3.3 **Version number**: v3.3 diff --git a/docs/release_notes/ibexa_dxp_v4.0.md b/docs/release_notes/ibexa_dxp_v4.0.md index 4895dc7c8b..9c7ae07b89 100644 --- a/docs/release_notes/ibexa_dxp_v4.0.md +++ b/docs/release_notes/ibexa_dxp_v4.0.md @@ -110,7 +110,7 @@ See [Exclusions](https://doc.ibexa.co/projects/userguide/en/latest/personalizati v4.0 sees significant code cleanup, including renaming of namespaces, services, REST API endpoints and many other internal names. -Refer to [Ibexa DXP v4.0 deprecations and backwards compatibility breaks](ibexa_dxp_v4.0_deprecations.md) +Refer to [[[= product_name =]] v4.0 deprecations and backwards compatibility breaks](ibexa_dxp_v4.0_deprecations.md) for full details of changes and how they influence your project. ## Full changelog diff --git a/docs/release_notes/ibexa_dxp_v4.0_deprecations.md b/docs/release_notes/ibexa_dxp_v4.0_deprecations.md index 7a24755958..e62abdeddc 100644 --- a/docs/release_notes/ibexa_dxp_v4.0_deprecations.md +++ b/docs/release_notes/ibexa_dxp_v4.0_deprecations.md @@ -1,6 +1,6 @@ -# Ibexa DXP v4.0 deprecations and backwards compatibility breaks +# [[= product_name =]] v4.0 deprecations and backwards compatibility breaks [[= product_name =]] v4.0 introduces changes to significant parts of the code to align with the product name change from earlier eZ Platform. diff --git a/docs/release_notes/ibexa_dxp_v4.1.md b/docs/release_notes/ibexa_dxp_v4.1.md index bf7956c4dc..162d36c79f 100644 --- a/docs/release_notes/ibexa_dxp_v4.1.md +++ b/docs/release_notes/ibexa_dxp_v4.1.md @@ -3,7 +3,7 @@ description: Ibexa DXP v4.1 enhances the PIM capabilities, adds a Measurement fi --- -# Ibexa DXP v4.1 +# [[= product_name =]] v4.1 **Version number**: v4.1 diff --git a/docs/release_notes/ibexa_dxp_v4.2.md b/docs/release_notes/ibexa_dxp_v4.2.md index 64e9093a95..a52431591f 100644 --- a/docs/release_notes/ibexa_dxp_v4.2.md +++ b/docs/release_notes/ibexa_dxp_v4.2.md @@ -4,7 +4,7 @@ description: Ibexa DXP v4.2 adds the Customer Portal and user management capabil -# Ibexa DXP v4.2 +# [[= product_name =]] v4.2 **Version number**: v4.2 diff --git a/docs/release_notes/ibexa_dxp_v4.3.md b/docs/release_notes/ibexa_dxp_v4.3.md index 3f8bc46a66..b3f72f6153 100644 --- a/docs/release_notes/ibexa_dxp_v4.3.md +++ b/docs/release_notes/ibexa_dxp_v4.3.md @@ -3,7 +3,7 @@ description: Ibexa DXP v4.3 adds the improvements to the Customer Portal, PIM an --- -# Ibexa DXP v4.3 +# [[= product_name =]] v4.3 **Version number**: v4.3 diff --git a/docs/release_notes/ibexa_dxp_v4.4.md b/docs/release_notes/ibexa_dxp_v4.4.md index 56efb3d45e..d780d5cb4a 100644 --- a/docs/release_notes/ibexa_dxp_v4.4.md +++ b/docs/release_notes/ibexa_dxp_v4.4.md @@ -3,7 +3,7 @@ description: Ibexa DXP v4.4 adds the improvements to the Welcome Page, All-new I --- -# Ibexa DXP v4.4 +# [[= product_name =]] v4.4 **Version number**: v4.4 @@ -56,7 +56,7 @@ for example, cropping, resizing and trimming before serving it to end user. Fastly is an external service that requires a separate subscription, to learn more see, [Fastly Image Optimizer website](https://docs.fastly.com/en/guides/about-fastly-image-optimizer). -If you already have Fastly IO subscription, you can move to [Fastly IO configuration in Ibexa DXP](https://doc.ibexa.co/en/4.4/content_management/images/fastly_io/). +If you already have Fastly IO subscription, you can move to [Fastly IO configuration in [[= product_name =]]](https://doc.ibexa.co/en/4.4/content_management/images/fastly_io/). #### Fastly VCL upload @@ -92,7 +92,7 @@ provide the best recommendations. ## Ibexa Connect You can now take advantage of [Ibexa Connect](https://www.ibexa.co/products/ibexa-connect), -an iPaaS (integration platform-as-a-service) which allows you to connect Ibexa DXP with third-party applications. +an iPaaS (integration platform-as-a-service) which allows you to connect [[= product_name =]] with third-party applications. [[= product_name_connect =]] features a low-code drag-and-drop interface and hundreds of connectors to different services that help you automate business processes. diff --git a/docs/release_notes/ibexa_dxp_v4.5.md b/docs/release_notes/ibexa_dxp_v4.5.md index aa236f5463..6e8e6c845a 100644 --- a/docs/release_notes/ibexa_dxp_v4.5.md +++ b/docs/release_notes/ibexa_dxp_v4.5.md @@ -4,7 +4,7 @@ description: Ibexa DXP v4.5 adds new features to Ibexa Commerce, translation com -# Ibexa DXP v4.5 +# [[= product_name =]] v4.5 **Version number**: v4.5 diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index 5586d64a0a..33c21a8ba0 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -4,7 +4,7 @@ description: Ibexa DXP v4.6 brings improvements to Commerce, PIM and Personaliza -# Ibexa DXP v4.6 +# [[= product_name =]] v4.6 **Version number**: v4.6 @@ -469,7 +469,7 @@ For more information, see [Ibexa Connect scenario block](https://doc.ibexa.co/en ### DDEV -[Ibexa DXP can officially be run on DDEV](https://ddev.readthedocs.io/en/latest/users/quickstart/#ibexa-dxp). For more information, see the [DDEV guide](https://doc.ibexa.co/en/master/getting_started/install_with_ddev/), which offers a step-by-step walkthrough for installing Ibexa DXP. +[[[= product_name =]] can officially be run on DDEV](https://ddev.readthedocs.io/en/latest/users/quickstart/#ibexa-dxp). For more information, see the [DDEV guide](https://doc.ibexa.co/en/master/getting_started/install_with_ddev/), which offers a step-by-step walkthrough for installing [[= product_name =]]. ### Customer Data Platform (CDP) @@ -482,7 +482,7 @@ For more information, see [CDP Activation](https://doc.ibexa.co/en/master/cdp/cd ### New packages -The following packages has been introduced in Ibexa DXP v4.6.0: +The following packages has been introduced in [[= product_name =]] v4.6.0: - [ibexa/oauth2-server](oauth_server.md) (optional) - ibexa/site-context @@ -503,7 +503,7 @@ The following packages has been introduced in Ibexa DXP v4.6.0: ### REST APIs -Ibexa DXP v4.6.0 adds REST API coverage for the following features: +[[= product_name =]] v4.6.0 adds REST API coverage for the following features: - Price engine - Shipping @@ -668,7 +668,7 @@ The following events have been added in the v4.6.0 release (39 events in total): ### View matchers -The following view matchers have been introduced in Ibexa DXP v4.6.0: +The following view matchers have been introduced in [[= product_name =]] v4.6.0: - `\Ibexa\Core\MVC\Symfony\Matcher\ContentBased\IsPreview` - `\Ibexa\Taxonomy\View\Matcher\TaxonomyEntryBased\Id` diff --git a/docs/release_notes/release_notes.md b/docs/release_notes/release_notes.md index 39d186da98..b056225bce 100644 --- a/docs/release_notes/release_notes.md +++ b/docs/release_notes/release_notes.md @@ -5,7 +5,7 @@ page_type: landing_page # Release notes -The latest stable and LTS (Long Term Support) version of [[= product_name =]] is [Ibexa DXP v4.6](ibexa_dxp_v4.6.md). +The latest stable and LTS (Long Term Support) version of [[= product_name =]] is [[[= product_name =]] v4.6](ibexa_dxp_v4.6.md). [[= cards([ diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md index abd528171f..dcbce2baaf 100644 --- a/docs/resources/new_in_doc.md +++ b/docs/resources/new_in_doc.md @@ -26,7 +26,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Getting started -- Added instructions in [Install Ibexa DXP](https://doc.ibexa.co/en/master/getting_started/install_ibexa_dxp/#create-project) about using PHP 8.3 to create a project +- Added instructions in [Install [[= product_name =]]](https://doc.ibexa.co/en/master/getting_started/install_ibexa_dxp/#create-project) about using PHP 8.3 to create a project - Updated the [requirements for running v3.3.x on PHP 8.3](https://doc.ibexa.co/en/master/getting_started/requirements/#php) ### Infrastructure and maintenance diff --git a/docs/resources/phpstorm_plugin.md b/docs/resources/phpstorm_plugin.md index 840297dc7d..7a43117a75 100644 --- a/docs/resources/phpstorm_plugin.md +++ b/docs/resources/phpstorm_plugin.md @@ -2,9 +2,9 @@ description: The Ibexa DXP PHPStorm plugin helps you speed up your development by providing file templates, autocompletion, a quick installation wizard, and more. --- -# Ibexa DXP plugin for PhpStorm +# [[= product_name =]] plugin for PhpStorm -Ibexa DXP plugin for PhpStorm helps you to work with Ibexa DXP by speeding up installation +[[= product_name =]] plugin for PhpStorm helps you to work with [[= product_name =]] by speeding up installation and providing file templates, intentions, autocompletion, and other features. ## Requirements @@ -14,14 +14,14 @@ and providing file templates, intentions, autocompletion, and other features. ## Install PhpStorm plugin -You can install the Ibexa DXP plugin for PhpStorm from the JetBrains Marketplace, +You can install the [[= product_name =]] plugin for PhpStorm from the JetBrains Marketplace, or manually, from a downloaded .jar file. ### Install from JetBrains Marketplace To install plugin from JetBrains marketplace: -Look for "Ibexa DXP" in the plugin browser and click **Install**. +Look for "[[= product_name =]]" in the plugin browser and click **Install**. ### Install from file @@ -49,23 +49,23 @@ You can use it to: Some plugin features depends on the selected product edition and version. For example, "deprecated namespaces usage" inspection is enabled only if the project uses v4.x. -Plugin configuration is automatically resolved when opening Ibexa DXP project for the first time. -If detection is successful, a notification appears with an "Enable Ibexa DXP support for this project" link. +Plugin configuration is automatically resolved when opening [[= product_name =]] project for the first time. +If detection is successful, a notification appears with an "Enable [[= product_name =]] support for this project" link. -If you created your project by using Ibexa DXP project wizard, the plugin is automatically enabled and configured based +If you created your project by using [[= product_name =]] project wizard, the plugin is automatically enabled and configured based on wizard data. ## Features ### Project wizard -The plugin enables creating a new Ibexa DXP project directly from PhpStorm. +The plugin enables creating a new [[= product_name =]] project directly from PhpStorm. To do it, select **File** > **New Project...** > **Ibexa DXP**. In project settings form you can choose: - Location of the project -- Product edition: Ibexa OSS, Ibexa Content, Ibexa Experience, Ibexa Commerce +- Product edition: Ibexa OSS, Ibexa Content, [[= product_name_exp =]], [[= product_name_com =]] - Authentication token (for Content, Experience and Commerce editions) - Product version: Default (latest LTS version), Latest (fast track or LTS), Latest LTS and "Next 3.x" (unstable, based on the 3.x branch) and "Next 4.x" (unstable, based on the 4.x branch) - Generate [Ibexa Cloud configuration](install_on_ibexa_cloud.md) @@ -106,7 +106,7 @@ The plugin provides the following built-in file templates: The templates are available in, for example, the context menu in **Project window** > **New** > **Ibexa DXP**. -The list of available file templates depends on the Ibexa DXP edition used by the project. +The list of available file templates depends on the [[= product_name =]] edition used by the project. For all file templates you can customize: diff --git a/docs/resources/release_process_and_roadmap.md b/docs/resources/release_process_and_roadmap.md index 8934287fcb..78d2f406de 100644 --- a/docs/resources/release_process_and_roadmap.md +++ b/docs/resources/release_process_and_roadmap.md @@ -2,7 +2,7 @@ description: "Ibexa DXP releases new versions periodically in different flavors: Ibexa Headless, Ibexa Experience and Ibexa Commerce, plus open-source Ibexa OSS." --- -# Ibexa DXP release process and roadmap +# [[= product_name =]] release process and roadmap ## Release process diff --git a/docs/tutorials/beginner_tutorial/1_get_ready.md b/docs/tutorials/beginner_tutorial/1_get_ready.md index cc906da90b..a8e18d9d7c 100644 --- a/docs/tutorials/beginner_tutorial/1_get_ready.md +++ b/docs/tutorials/beginner_tutorial/1_get_ready.md @@ -6,7 +6,7 @@ description: Start the tutorial by getting a clean installation of Ibexa DXP. To begin the tutorial, you need a clean installation of [[= product_name =]]. -Get it by following the [install Ibexa DXP](install_ibexa_dxp.md) guide. +Get it by following the [install [[= product_name =]]](install_ibexa_dxp.md) guide. You need a web server, a relational database and PHP. The clean installation contains only a root content item which displays a welcome page. diff --git a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md index 8e87d2cd07..3681254569 100644 --- a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md +++ b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md @@ -7,7 +7,7 @@ description: Learn how to create a Value class that stores the value of the fiel ## Project installation To start the tutorial, you need to make a clean [[= product_name =]] installation. -Follow the guide for your system to [install Ibexa DXP](install_ibexa_dxp.md), +Follow the guide for your system to [install [[= product_name =]]](install_ibexa_dxp.md), [configure a server](requirements.md), and [start the web server](install_ibexa_dxp.md#use-phps-built-in-server). Remember to install using the `dev` environment. diff --git a/docs/update_and_migration/from_3.3/update_from_3.3.md b/docs/update_and_migration/from_3.3/update_from_3.3.md index 1833eb9396..076a5bc274 100644 --- a/docs/update_and_migration/from_3.3/update_from_3.3.md +++ b/docs/update_and_migration/from_3.3/update_from_3.3.md @@ -368,7 +368,7 @@ See [Update Flex server](#update-flex-server). #### VCL configuration for Fastly -Ibexa DXP now supports Fastly shielding. If you're using Fastly and want to use shielding, you need to update your VCL files. +[[= product_name =]] now supports Fastly shielding. If you're using Fastly and want to use shielding, you need to update your VCL files. !!! tip diff --git a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md index eb3aaa9d96..d1f7f335b3 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md @@ -195,7 +195,7 @@ Apply the following database update scripts: #### Ibexa Open Source -If you have no access to Ibexa DXP's `ibexa/installer` package, database upgrade isn't necessary. +If you have no access to [[= product_name =]]'s `ibexa/installer` package, database upgrade isn't necessary. ## Ensure password safety diff --git a/docs/update_and_migration/update_ibexa_dxp.md b/docs/update_and_migration/update_ibexa_dxp.md index 7175101c17..351cbd9175 100644 --- a/docs/update_and_migration/update_ibexa_dxp.md +++ b/docs/update_and_migration/update_ibexa_dxp.md @@ -2,7 +2,7 @@ description: Update your installation to the latest supported version. --- -# Updating Ibexa DXP +# Updating [[= product_name =]] To update [[= product_name =]] to a newer version, select the version you're currently using: From 99a61d910dc6e45a444f3b91d0a2f1759bd9c15e Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 14:58:09 +0200 Subject: [PATCH 17/77] More fixes --- .../extending_thumbnails.md | 2 +- .../importing_assets_from_bundle.md | 2 +- .../reusable_components.md | 6 +- .../back_office_menus/back_office_menus.md | 2 +- .../customize_search_suggestion.md | 2 +- .../back_office/multifile_upload.md | 2 +- .../back_office/notifications.md | 2 +- .../back_office/subitems_list.md | 2 +- .../configuration/dynamic_configuration.md | 6 +- .../configuration/repository_configuration.md | 6 +- .../content_organization/content_types.md | 4 +- .../content_organization/sections.md | 2 +- .../dashboard/customize_dashboard.md | 4 +- .../project_organization/bundles.md | 10 ++-- .../project_organization.md | 2 +- .../recent_activity/recent_activity.md | 6 +- docs/api/graphql/graphql.md | 2 +- docs/api/graphql/graphql_custom_ft.md | 2 +- docs/api/graphql/graphql_operations.md | 2 +- docs/api/graphql/graphql_queries.md | 2 +- docs/api/php_api/php_api.md | 2 +- .../rest_api/rest_api_usage/rest_responses.md | 5 +- docs/cdp/cdp.md | 2 +- .../cdp_add_clientside_tracking.md | 1 + docs/cdp/cdp_guide.md | 2 +- docs/cdp/cdp_installation.md | 4 +- docs/commerce/checkout/customize_checkout.md | 2 +- docs/commerce/payment/extend_payment.md | 2 +- docs/commerce/payment/payum_integration.md | 2 +- .../shipping_management/extend_shipping.md | 2 +- .../transactional_emails.md | 2 +- .../content_availability.md | 2 +- .../content_management_guide.md | 2 +- docs/content_management/content_model.md | 11 ++-- .../data_migration/exporting_data.md | 4 +- .../data_migration/managing_migrations.md | 2 +- .../create_custom_generic_field_type.md | 10 +--- .../field_type_reference/formfield.md | 2 +- .../field_type_reference/imagefield.md | 2 +- .../field_types/field_types.md | 2 +- .../field_types/form_and_template.md | 6 +- .../file_management/file_url_handling.md | 2 +- .../forms/work_with_forms.md | 3 +- .../images/add_image_asset_from_dam.md | 6 +- .../images/configure_image_editor.md | 3 +- docs/content_management/images/fastly_io.md | 4 +- docs/content_management/images/images.md | 2 + .../pages/ibexa_connect_scenario_block.md | 4 +- .../pages/page_block_attributes.md | 1 + .../pages/page_block_validators.md | 2 +- .../pages/page_builder_guide.md | 5 +- .../rich_text/create_custom_richtext_block.md | 3 +- .../rich_text/extend_online_editor.md | 1 + .../rich_text/online_editor_guide.md | 6 +- docs/customer_management/cp_configuration.md | 1 + docs/getting_started/first_steps.md | 26 ++------- docs/getting_started/install_ibexa_dxp.md | 11 ++-- docs/getting_started/install_with_ddev.md | 4 +- docs/getting_started/requirements.md | 46 +++++++-------- docs/ibexa_cloud/ddev_and_ibexa_cloud.md | 4 +- docs/ibexa_cloud/install_on_ibexa_cloud.md | 14 ++--- docs/ibexa_engage/create_campaign.md | 2 +- docs/ibexa_engage/install_ibexa_engage.md | 4 +- docs/ibexa_engage/integrate_ibexa_connect.md | 6 +- docs/ibexa_products/editions.md | 2 +- docs/ibexa_products/ibexa_commerce.md | 3 +- docs/ibexa_products/ibexa_experience.md | 11 ++-- docs/ibexa_products/ibexa_headless.md | 1 + .../cache/http_cache/content_aware_cache.md | 6 +- .../cache/http_cache/fastly.md | 16 ++--- .../cache/http_cache/reverse_proxy.md | 2 +- .../cache/persistence_cache.md | 2 +- .../clustering/clustering_with_ddev.md | 6 +- docs/infrastructure_and_maintenance/devops.md | 2 +- .../security/reporting_issues.md | 9 +-- .../security/security_checklist.md | 21 +++---- .../support_and_maintenance_faq.md | 2 +- .../languages/back_office_translations.md | 2 +- docs/multisite/languages/languages.md | 6 +- docs/multisite/multisite_configuration.md | 7 ++- docs/multisite/site_factory/site_factory.md | 4 +- .../site_factory_configuration.md | 4 +- .../siteaccess_aware_configuration.md | 4 +- .../siteaccess/siteaccess_matching.md | 2 +- docs/permissions/limitation_reference.md | 6 +- docs/permissions/permission_use_cases.md | 2 +- .../api_reference/content_api.md | 2 +- .../api_reference/recommendation_api.md | 12 ++-- .../api_reference/tracking_api.md | 14 +++-- .../personalization/api_reference/user_api.md | 2 +- .../personalization/enable_personalization.md | 5 +- .../integrate_recommendation_service.md | 2 +- .../legacy_recommendation_api.md | 6 +- docs/personalization/personalization_guide.md | 2 +- docs/pim/pim_guide.md | 6 +- docs/release_notes/ez_platform_v1.11.0.md | 3 +- docs/release_notes/ez_platform_v1.12.0.md | 11 ++-- docs/release_notes/ez_platform_v2.1.0.md | 2 +- docs/release_notes/ez_platform_v2.2.0.md | 4 +- docs/release_notes/ez_platform_v2.3.md | 10 ++-- docs/release_notes/ez_platform_v2.4.md | 12 ++-- docs/release_notes/ez_platform_v2.5.md | 6 +- docs/release_notes/ez_platform_v3.0.md | 8 +-- .../ez_platform_v3.0_deprecations.md | 2 +- docs/release_notes/ez_platform_v3.1.md | 2 +- docs/release_notes/ibexa_dxp_v3.2.md | 17 +++--- docs/release_notes/ibexa_dxp_v3.3.md | 6 +- docs/release_notes/ibexa_dxp_v4.0.md | 16 ++--- docs/release_notes/ibexa_dxp_v4.1.md | 4 +- docs/release_notes/ibexa_dxp_v4.2.md | 6 +- docs/release_notes/ibexa_dxp_v4.3.md | 5 +- docs/release_notes/ibexa_dxp_v4.4.md | 18 +++--- docs/release_notes/ibexa_dxp_v4.5.md | 11 ++-- docs/release_notes/ibexa_dxp_v4.6.md | 23 ++++---- .../contributing/report_and_follow_issues.md | 4 +- docs/resources/new_in_doc.md | 58 +++++++++---------- docs/resources/phpstorm_plugin.md | 14 ++--- .../rawrange_aggregation.md | 2 +- .../rawstats_aggregation.md | 2 +- .../rawterm_aggregation.md | 2 +- .../customprice_criterion.md | 2 +- .../isfieldempty_criterion.md | 2 +- .../search_criteria_reference.md | 2 +- .../search_criteria_and_sort_clauses.md | 2 +- .../configure_elastic_search.md | 7 ++- .../elastic_search/install_elastic_search.md | 7 ++- .../legacy_search_overview.md | 1 + .../solr_search_engine/install_solr.md | 7 ++- .../customfield_sort_clause.md | 2 +- .../customprice_sort_clause.md | 2 +- .../field_sort_clause.md | 2 +- docs/snippets/update/db/db_backup_warning.md | 2 +- docs/snippets/update/finish_the_update.md | 4 +- docs/snippets/update/merge_composer.md | 4 +- .../design_engine/add_new_design.md | 2 +- docs/templating/layout/add_search_form.md | 2 +- .../queries_and_controllers/controllers.md | 4 +- .../create_custom_query_type.md | 4 +- .../cart_twig_functions.md | 2 +- .../urls_and_routes/custom_breadcrumbs.md | 2 +- .../4_display_single_content_item.md | 4 +- .../5_display_a_list_of_content_items.md | 3 +- .../8_enable_account_registration.md | 2 +- .../2_define_point2d_field_type.md | 1 + .../3_create_form_for_point2d.md | 3 +- .../4_introduce_a_template.md | 3 +- .../creating_a_point2d_field_type.md | 2 +- .../1_get_a_starter_website.md | 4 +- .../3_use_existing_blocks.md | 2 +- .../from_1.x_2.x/update_app_to_2.5.md | 4 +- .../from_1.x_2.x/update_db_to_2.5.md | 4 +- .../from_2.5/to_3.3.latest.md | 2 +- docs/update_and_migration/from_2.5/to_3.3.md | 6 +- docs/update_and_migration/from_3.3/to_4.0.md | 2 +- .../from_3.3/update_from_3.3.md | 2 +- .../from_4.3/update_from_4.3.md | 4 +- .../from_4.3/update_from_4.3_new_commerce.md | 14 ++--- .../from_4.3/update_from_4.3_old_commerce.md | 8 +-- .../from_4.4/update_from_4.4.md | 5 +- .../from_4.5/update_from_4.5.md | 2 +- .../migrate_to_ibexa_dxp/common_issues.md | 3 +- .../migrating_from_ez_publish.md | 2 +- .../migrating_from_ez_publish_platform.md | 18 +++--- docs/users/login_methods.md | 2 +- docs/users/oauth_client.md | 2 +- docs/users/oauth_server.md | 2 + docs/users/passwords.md | 3 +- docs/users/user_authentication.md | 2 +- 168 files changed, 456 insertions(+), 433 deletions(-) diff --git a/docs/administration/back_office/back_office_elements/extending_thumbnails.md b/docs/administration/back_office/back_office_elements/extending_thumbnails.md index 40ab2bd489..661086ca08 100644 --- a/docs/administration/back_office/back_office_elements/extending_thumbnails.md +++ b/docs/administration/back_office/back_office_elements/extending_thumbnails.md @@ -5,7 +5,7 @@ description: Customize thumbnails use for content items in the back office. # Extending thumbnails The thumbnails API enable you to easily choose an image for a specific content. -If you do not want to use custom thumbnails, `ContentType` is used instead. +If you don't want to use custom thumbnails, `ContentType` is used instead. ## Thumbnail mechanism diff --git a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md index 4fcca0c224..833bff03ef 100644 --- a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md +++ b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md @@ -68,7 +68,7 @@ module.exports = (ibexaConfig, ibexaConfigManager) => { !!! tip - If you do not know what `entryName` to use, you can use the browser's developer tools to check what files are loaded on the given page. + If you don't know what `entryName` to use, you can use the browser's developer tools to check what files are loaded on the given page. Then, use the file name as `entryName`. !!! tip diff --git a/docs/administration/back_office/back_office_elements/reusable_components.md b/docs/administration/back_office/back_office_elements/reusable_components.md index c4f28cc621..cc912509f5 100644 --- a/docs/administration/back_office/back_office_elements/reusable_components.md +++ b/docs/administration/back_office/back_office_elements/reusable_components.md @@ -21,7 +21,7 @@ The alert component has the following properties: - `type` - available types of alert: error, info, success, and warning - `icon` - name of the icon, taken from the default icon set -- `icon_path` - full icon path, in case you do not want to use an icon from the default icon set +- `icon_path` - full icon path, in case you don't want to use an icon from the default icon set - `title` - alert title - `subtitle` - displays subtitle content - `show_subtitle_below` - default set to `false`, the subtitle is displayed next to the title @@ -214,7 +214,7 @@ which holds the id of the button that should be enabled/disabled after a checkbo Next, pass a button under the `action` parameter to the table headline. -Action buttons are rendered on the right side of the table headline (do not confuse it with the table header). +Action buttons are rendered on the right side of the table headline (don't confuse it with the table header). You can also specify headline text, which is a table title displayed above, by passing it under `headline` parameter. You can generate various headline texts using the `results_headline` macro with a few parameters: @@ -284,7 +284,7 @@ Other table component parameters include: - `attr` - (other HTML attributes applied on the HTML table element), for example: - `attr: { 'data-some-data-attribute-you-need': 'foo' }` - `table_body_class` and `table_body_attr` are the same as mentioned earlier, but applied on the table element -- `show_head_cols_if_empty` - (default: `false`), by default, when `body_rows` is empty, the table component does not show the table header, but you may want to have it because for example rows are rendered dynamically with JavaScript on the browser side. +- `show_head_cols_if_empty` - (default: `false`), by default, when `body_rows` is empty, the table component doesn't show the table header, but you may want to have it because for example rows are rendered dynamically with JavaScript on the browser side. To avoid wrapping headline inside the form, as it's done in the earlier example, you can `embed` table and override the `between_header_and_table` block: diff --git a/docs/administration/back_office/back_office_menus/back_office_menus.md b/docs/administration/back_office/back_office_menus/back_office_menus.md index 717ec37114..a3c1f4fc5d 100644 --- a/docs/administration/back_office/back_office_menus/back_office_menus.md +++ b/docs/administration/back_office/back_office_menus/back_office_menus.md @@ -65,7 +65,7 @@ You can listen to the following events: To add a menu item, use the `addChild()` method. Provide the method with the new menu item's identifier and, optionally, with parameters. -To add an inactive menu section, do not add a route to its parameters. +To add an inactive menu section, don't add a route to its parameters. The following method adds a new menu section under **Content**, and under it, a new item with custom attributes: diff --git a/docs/administration/back_office/customize_search_suggestion.md b/docs/administration/back_office/customize_search_suggestion.md index 7fb24af739..3c6e66f1dd 100644 --- a/docs/administration/back_office/customize_search_suggestion.md +++ b/docs/administration/back_office/customize_search_suggestion.md @@ -5,7 +5,7 @@ description: Customize search suggestion configuration and sources. # Customize search suggestion In the back office, when you start typing in the search field on the top bar, suggestions about what you could be looking for show up directly under the field. -For more information about using this feature to search for content, see [user documentation]([[= user_doc =]]/search/search_for_content). +For more information about using this feature to search for content, see [User Documentation]([[= user_doc =]]/search/search_for_content). ## Configuration diff --git a/docs/administration/back_office/multifile_upload.md b/docs/administration/back_office/multifile_upload.md index 08fe7c10da..9e6e4ac3ba 100644 --- a/docs/administration/back_office/multifile_upload.md +++ b/docs/administration/back_office/multifile_upload.md @@ -89,7 +89,7 @@ There are two types of properties: **required** and **optional**. ### Required properties -All of the following properties must be used, otherwise the multi-file upload does not work. +All of the following properties must be used, otherwise the multi-file upload doesn't work. - **onAfterUpload** _{Function}_ - a callback to be invoked immediately after a file has been uploaded - **adminUiConfig** _{Object}_ - UI config object. It should keep the following structure: diff --git a/docs/administration/back_office/notifications.md b/docs/administration/back_office/notifications.md index cb0d83597b..73e9c7fb11 100644 --- a/docs/administration/back_office/notifications.md +++ b/docs/administration/back_office/notifications.md @@ -103,4 +103,4 @@ ibexa: timeout: 0 ``` -The values shown above are the defaults. `0` means the notification does not hide automatically. +The values shown above are the defaults. `0` means the notification doesn't hide automatically. diff --git a/docs/administration/back_office/subitems_list.md b/docs/administration/back_office/subitems_list.md index 9b4a2366c5..42378c734d 100644 --- a/docs/administration/back_office/subitems_list.md +++ b/docs/administration/back_office/subitems_list.md @@ -104,7 +104,7 @@ Optionally, Sub-items module can take a following list of props: ## Reuse Sub-items list -To add a Sub-items list on a page that does not have the (right) action sidebar, you need to do one of the following things: +To add a Sub-items list on a page that doesn't have the (right) action sidebar, you need to do one of the following things: - add a `
` element with the `.ibexa-extra-actions-container` selector - change the selector in the Sub-items settings by sending the `languageContainerSelector` prop which takes the selector for the element that renders the `languageSelector`. diff --git a/docs/administration/configuration/dynamic_configuration.md b/docs/administration/configuration/dynamic_configuration.md index 33e22fb6ca..574fd8ea67 100644 --- a/docs/administration/configuration/dynamic_configuration.md +++ b/docs/administration/configuration/dynamic_configuration.md @@ -70,13 +70,11 @@ services: You can also use the [autowire feature]([[= symfony_doc =]]/service_container/autowiring.html), by type hinting against ConfigResolverInterface. -!!! tip - - For more information about dependency injection, see [Service container](php_api.md#service-container). +For more information about dependency injection, see [Service container](php_api.md#service-container). !!! note - Do not store the retrieved config value unless you know what you're doing. + Don't store the retrieved config value unless you know what you're doing. SiteAccess can change during code execution, which means you might work on the wrong value. ``` php diff --git a/docs/administration/configuration/repository_configuration.md b/docs/administration/configuration/repository_configuration.md index 1c68fc64bb..a25c8e6ada 100644 --- a/docs/administration/configuration/repository_configuration.md +++ b/docs/administration/configuration/repository_configuration.md @@ -10,7 +10,7 @@ You can define several Repositories within a single application. However, you ca ### Using default values -To use the default Repository connection, you do not need to specify its details: +To use the default Repository connection, you don't need to specify its details: ``` yaml ibexa: @@ -46,7 +46,7 @@ ibexa: #### Multisite URI matching with multi-Repository setup You can use only one Repository (database) per domain. -This does not prohibit using [different Repositories](persistence_cache.md#multi-repository-setup) on different subdomains. +This doesn't prohibit using [different Repositories](persistence_cache.md#multi-repository-setup) on different subdomains. However, when using URI matching for multisite setup, all SiteAccesses sharing domain also need to share Repository. For example: @@ -80,7 +80,7 @@ ibexa: prefix: Ibexa\Bundle\Core\Entity ``` -Refer to [DoctrineBundle documentation](https://symfony.com/doc/3.4/reference/configuration/doctrine.html) for more information. +For more information, see [DoctrineBundle documentation](https://symfony.com/doc/3.4/reference/configuration/doctrine.html). !!! note diff --git a/docs/administration/content_organization/content_types.md b/docs/administration/content_organization/content_types.md index f992190b15..484d99c1ed 100644 --- a/docs/administration/content_organization/content_types.md +++ b/docs/administration/content_organization/content_types.md @@ -17,7 +17,7 @@ Content types are organized into groups. You can add your own groups here to keep your content types in better order. -For a full tutorial, see [Add a content type](first_steps.md#add-a-content-type) or follow [user documentation](https://doc.ibexa.co/projects/userguide/en/latest/content_management/create_edit_content_types/). +For a full tutorial, see [Add a content type](first_steps.md#add-a-content-type) or follow [User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/content_management/create_edit_content_types/). For a detailed overview of the content model, see [Content model overview](content_model.md). ## Content type metadata @@ -29,7 +29,7 @@ It can consist of letters, digits, spaces, and special characters (it's mandator !!! note - Even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), do not confuse it with this Name, which is a piece of metadata, not a field. + Even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), don't confuse it with this Name, which is a piece of metadata, not a field. **Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It must be unique, can only contain lowercase letters, digits, and underscores (it's mandatory and the maximum length is 50 characters). diff --git a/docs/administration/content_organization/sections.md b/docs/administration/content_organization/sections.md index 7d65f7b7f0..218bd6ca78 100644 --- a/docs/administration/content_organization/sections.md +++ b/docs/administration/content_organization/sections.md @@ -20,7 +20,7 @@ In addition, if the main Location of a content item with multiple Location assig When content is moved to a different Location, the item itself and all of its subtree are assigned to the Section of the new Location. It works only for copy and move. -Assigning a new Section to a parent content item does not affect the subtree, meaning that subtree cannot currently be updated this way. +Assigning a new Section to a parent content item doesn't affect the subtree, meaning that subtree cannot currently be updated this way. Sections can only be removed if no content items are assigned to them. Even then, it should be done carefully. diff --git a/docs/administration/dashboard/customize_dashboard.md b/docs/administration/dashboard/customize_dashboard.md index 80d5977b3d..b8fc6ee4e2 100644 --- a/docs/administration/dashboard/customize_dashboard.md +++ b/docs/administration/dashboard/customize_dashboard.md @@ -10,7 +10,7 @@ Customized dashboard displays a set of widgets selected by the user. !!! tip - Detailed instruction on how to customize dashboard using Dashboard Builder is available in [[[= product_name =]] user documentation](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/dashboard/work_with_dashboard/#customize-dashboard). + Detailed instruction on how to customize dashboard using Dashboard Builder is available in [[[= product_name =]] User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/dashboard/work_with_dashboard/#customize-dashboard). ## Manage permissions @@ -32,7 +32,7 @@ For more information, see [Customize storefront layout](customize_storefront_lay Dashboard builder provides set of ready-to-use blocks, for example, Common content, Quick actions, or [[= product_name =]] News. -For more information about available blocks, see [[[= product_name =]] user documentation](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/dashboard/dashboard_block_reference/). +For more information about available blocks, see [[[= product_name =]] User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/dashboard/dashboard_block_reference/). In addition to existing blocks available in Dashboard Builder, you can also create custom blocks. diff --git a/docs/administration/project_organization/bundles.md b/docs/administration/project_organization/bundles.md index 6c4ee0d029..0860c4aec6 100644 --- a/docs/administration/project_organization/bundles.md +++ b/docs/administration/project_organization/bundles.md @@ -33,7 +33,7 @@ When overriding files, the path inside your application has to correspond to the ### Removing bundles -To remove a bundle (either one you created yourself, or an out-of-the-box one that you do not need), see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc. +To remove a bundle (either one you created yourself, or an out-of-the-box one that you don't need), see the [How to Remove a Bundle]([[= symfony_doc =]]/bundles/remove.html) instruction in Symfony doc. ## Core packages @@ -65,13 +65,13 @@ To remove a bundle (either one you created yourself, or an out-of-the-box one th |[ibexa/system-info](https://github.com/ibexa/system-info)| Information about the system [[= product_name =]] is running on| |[ibexa/user](https://github.com/ibexa/user)|User management| -## Ibexa Headless packages +## [[= product_name_headless =]] packages |Bundle|Description| |---------|-----------| |ibexa/oss|Core packages| |ibexa/content-tree|content tree functionality| -|ibexa/connect|[Ibexa Connect](https://doc.ibexa.co/projects/connect/en/latest/)| +|ibexa/connect|[[[= product_name_connect =]]](https://doc.ibexa.co/projects/connect/en/latest/)| |ibexa/calendar|Calendar tab with a calendar widget| |ibexa/connector-dam|Connector for DAM (Digital Asset Management) systems| |ibexa/elasticsearch|Integration with Elasticsearch search engine| @@ -99,7 +99,7 @@ To remove a bundle (either one you created yourself, or an out-of-the-box one th |ibexa/commerce-shop-ui|UI for the shop front page **deprecated** | |ibexa/commerce-shop|Main shop functionalities **deprecated** | -## Ibexa Experience packages +## [[= product_name_exp =]] packages |Bundle|Description| |---------|-----------| @@ -116,7 +116,7 @@ To remove a bundle (either one you created yourself, or an out-of-the-box one th |ibexa/connector-qualifio|Enables integration with [Qualifio Engage platform](https://developers.qualifio.com/docs/engage/)| -## Ibexa Commerce packages +## [[= product_name_com =]] packages |Bundle|Description| |---------|-----------| diff --git a/docs/administration/project_organization/project_organization.md b/docs/administration/project_organization/project_organization.md index 165042989e..465f4af88f 100644 --- a/docs/administration/project_organization/project_organization.md +++ b/docs/administration/project_organization/project_organization.md @@ -39,7 +39,7 @@ All project assets are accessible through the `assets` path. ## Configuration You project's configuration is placed in the respective files in `config/packages`. -See [Configuration](configuration.md) for more information. +For more information, see [Configuration](configuration.md). ### Importing configuration from a bundle diff --git a/docs/administration/recent_activity/recent_activity.md b/docs/administration/recent_activity/recent_activity.md index ad7e786ee5..7d9fcbbf4f 100644 --- a/docs/administration/recent_activity/recent_activity.md +++ b/docs/administration/recent_activity/recent_activity.md @@ -8,7 +8,7 @@ Recent activity log displays last actions in the repository (whatever their orig ![Recent activity](admin_panel_recent_activity.png) -To learn more about its back office usage and the actions logged by default, see [Recent activity in the User documentation]([[= user_doc =]]/recent_activity/recent_activity/). +To learn more about its back office usage and the actions logged by default, see [Recent activity in User Documentation]([[= user_doc =]]/recent_activity/recent_activity/). ## Configuration and cronjob @@ -51,7 +51,7 @@ This policy is required to view [activity log in user profile]([[= user_doc =]]/ !!! caution - Do not assign `activity_log/read` permission to the Anonymous role, even with the owner limitation, because this role is shared among all unauthenticated users. + Don't assign `activity_log/read` permission to the Anonymous role, even with the owner limitation, because this role is shared among all unauthenticated users. ## User privacy @@ -131,7 +131,7 @@ migration !!! caution Keep activity logging as light as possible. - Do not make database requests or heavy computation at logging time. + Don't make database requests or heavy computation at logging time. Keep them for activity log list display time. #### Create an entry diff --git a/docs/api/graphql/graphql.md b/docs/api/graphql/graphql.md index da5759be2c..29eb0d1842 100644 --- a/docs/api/graphql/graphql.md +++ b/docs/api/graphql/graphql.md @@ -24,7 +24,7 @@ They contain information about the domain objects and the fields you can [query] ### Schema generation limitations -GraphQL schema cannot be generated for names that do not follow the [GraphQL specification](http://spec.graphql.org/June2018/#sec-Names), for example names that start with a digit. +GraphQL schema cannot be generated for names that don't follow the [GraphQL specification](http://spec.graphql.org/June2018/#sec-Names), for example names that start with a digit. This concerns image variations, content types, content type groups, product types, and field definition identifiers. diff --git a/docs/api/graphql/graphql_custom_ft.md b/docs/api/graphql/graphql_custom_ft.md index c7f4b6920d..2bee87bc74 100644 --- a/docs/api/graphql/graphql_custom_ft.md +++ b/docs/api/graphql/graphql_custom_ft.md @@ -170,7 +170,7 @@ The following variables are available in the resolver's expression: - `field` is the current field, as an extension of the API's field object that proxies properties requests to the field Value - `content` is the resolved content item's `Content` -- `location` is the content item's resolved location, for more information, see [Querying Locations](graphql_queries.md#querying-locations) +- `location` is the content item's resolved location. For more information, see [Querying Locations](graphql_queries.md#querying-locations) - `item` is the content together with its location `\Ibexa\GraphQL\Value\Item` `RelationFieldValueBuilder` or `SelectionFieldValueBuilder` can be used as examples. \ No newline at end of file diff --git a/docs/api/graphql/graphql_operations.md b/docs/api/graphql/graphql_operations.md index 4bac2e3dd1..96b2e54351 100644 --- a/docs/api/graphql/graphql_operations.md +++ b/docs/api/graphql/graphql_operations.md @@ -154,7 +154,7 @@ curl -v -X POST \ !!! note "Authentication" The example above requires you to set your authentication cookie in the `$AUTH_COOKIE` variable. - See [Authentication](graphql.md#authentication) for more information. + For more information, see [Authentication](graphql.md#authentication). ### Uploading multiple files diff --git a/docs/api/graphql/graphql_queries.md b/docs/api/graphql/graphql_queries.md index 49106e66f6..f46e604c29 100644 --- a/docs/api/graphql/graphql_queries.md +++ b/docs/api/graphql/graphql_queries.md @@ -101,7 +101,7 @@ Response: } ``` -When you do not specify a language, the response contains the most prioritized translation. +When you don't specify a language, the response contains the most prioritized translation. ### Get a group of content items diff --git a/docs/api/php_api/php_api.md b/docs/api/php_api/php_api.md index 7a85a1fa94..68c4927b93 100644 --- a/docs/api/php_api/php_api.md +++ b/docs/api/php_api/php_api.md @@ -103,7 +103,7 @@ The User may, for example, not be allowed to create content, or view a particula To skip permission checks, you can use the `sudo()` method. It allows API execution to be performed with full access, sand-boxed. -You can use this method to perform an action that the current User does not have permissions for. +You can use this method to perform an action that the current user doesn't have permissions for. For example, to [hide a Location](managing_content.md#hiding-and-revealing-locations), use: diff --git a/docs/api/rest_api/rest_api_usage/rest_responses.md b/docs/api/rest_api/rest_api_usage/rest_responses.md index 3e12e79d5f..3a9614ef66 100644 --- a/docs/api/rest_api/rest_api_usage/rest_responses.md +++ b/docs/api/rest_api/rest_api_usage/rest_responses.md @@ -137,10 +137,7 @@ Content-Type: application/vnd.ibexa.api.Content+json [Cross-Origin Resource Sharing (CORS)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) can allow the REST API to be reached from a page on another domain. -!!! tip "More information about CORS" - - - [WHATWG's CORS Protocol specification](https://fetch.spec.whatwg.org/#cors-protocol) - - [Overview of CORS on developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) +For more information about CORS, see [WHATWG's CORS Protocol specification](https://fetch.spec.whatwg.org/#cors-protocol) and [Overview of CORS on developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). CORS support is provided by the third party [nelmio/cors-bundle](https://packagist.org/packages/nelmio/cors-bundle). You can read more about it in [NelmioCorsBundle's README](https://github.com/nelmio/NelmioCorsBundle/blob/master/README.md). diff --git a/docs/cdp/cdp.md b/docs/cdp/cdp.md index 5c77b73db5..51259b70bb 100644 --- a/docs/cdp/cdp.md +++ b/docs/cdp/cdp.md @@ -5,7 +5,7 @@ edition: experience # Customer Data Platform (CDP) -## What is Ibexa CDP +## What is [[= product_name_cdp =]] [[= product_name_cdp =]] helps you solve one of the hardest challenges facing business world today: building unique experiences for your customers. With [[= product_name_cdp =]] you're able to track and aggregate data of your customers' activity on multiple channels. diff --git a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md index ea1b6e829b..7ab8db8878 100644 --- a/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md +++ b/docs/cdp/cdp_activation/cdp_add_clientside_tracking.md @@ -7,6 +7,7 @@ edition: experience The final step is setting up a tracking script. It requires a head tracking script between the `` tags on your website, a main script after the head script, and cookie consent. + For more information about setting up a tracking script, see [a tutorial in Raptor documentation](https://support.raptorsmartadvisor.com/hc/en-us/articles/9563346335004-Client-Side-Tracking). Now, you need to add a tracker to specific places in your website where you want to track users. diff --git a/docs/cdp/cdp_guide.md b/docs/cdp/cdp_guide.md index 71ab5229d8..61afc531f4 100644 --- a/docs/cdp/cdp_guide.md +++ b/docs/cdp/cdp_guide.md @@ -20,7 +20,7 @@ It includes first, second, and third-party data from multiple sources such as tr [[= product_name_cdp =]] is available in [[= product_name_exp =]] and [[= product_name_com =]] editions. -## How does Ibexa CDP work +## How does [[= product_name_cdp =]] work [[= product_name_cdp =]] unifies customer data throughout your whole organization. It helps you activate your users and give them real-time interaction. diff --git a/docs/cdp/cdp_installation.md b/docs/cdp/cdp_installation.md index 3b34652a83..e49e9b1aa2 100644 --- a/docs/cdp/cdp_installation.md +++ b/docs/cdp/cdp_installation.md @@ -3,12 +3,12 @@ description: Installation of standalone Ibexa CDP package. edition: experience --- -# Ibexa CDP installation +# [[= product_name_cdp =]] installation There are three steps required to install [[= product_name_cdp =]]. First, you need to register your [[= product_name_cdp =]] account, then you can download a CDP package and update the configuration. -## Register in Ibexa CDP dashboard +## Register in [[= product_name_cdp =]] dashboard If you decide to acquire [[= product_name_cdp =]] contact your sales representative, they provide you with a registration link to [[= product_name_cdp =]]. After registration, you get access to a separate instance where you can find data required for configuring, activating, and using this feature. diff --git a/docs/commerce/checkout/customize_checkout.md b/docs/commerce/checkout/customize_checkout.md index 6ca8db41fc..c6aaf415c4 100644 --- a/docs/commerce/checkout/customize_checkout.md +++ b/docs/commerce/checkout/customize_checkout.md @@ -287,7 +287,7 @@ ibexa: customer_content_type: ``` -Then, define custom address formats, which, for example, do not include the `locality` field: +Then, define custom address formats, which, for example, don't include the `locality` field: ``` yaml ibexa_field_type_address: diff --git a/docs/commerce/payment/extend_payment.md b/docs/commerce/payment/extend_payment.md index 7c5a69c3af..17ec29cf41 100644 --- a/docs/commerce/payment/extend_payment.md +++ b/docs/commerce/payment/extend_payment.md @@ -19,7 +19,7 @@ Code samples below show how this could be done if your organization wants to use !!! note "Gateway integration requirement" - [[= product_name =]] does not come with gateway redirects. Whether you're an integrator or an end customer, it's your responsibility to implement payment gateway integration. + [[= product_name =]] doesn't come with gateway redirects. Whether you're an integrator or an end customer, it's your responsibility to implement payment gateway integration. ### Define custom payment method type diff --git a/docs/commerce/payment/payum_integration.md b/docs/commerce/payment/payum_integration.md index 8442337dba..d3b942cd48 100644 --- a/docs/commerce/payment/payum_integration.md +++ b/docs/commerce/payment/payum_integration.md @@ -77,5 +77,5 @@ For a list of events, see [Event dispatcher](https://github.com/Payum/Payum/blob !!! caution In certain cases, depending on the payment processing service, when a customer closes the payment page in a browser and the bank has not processed the payment yet, the payment status can remain unchanged. - Depending on how your checkout process is configured, it may result in unwanted effects, for example, cause that the cart does not purge after the purchase. + Depending on how your checkout process is configured, it may result in unwanted effects, for example, cause that the cart doesn't purge after the purchase. Make sure that you account for this fact in your implementation. diff --git a/docs/commerce/shipping_management/extend_shipping.md b/docs/commerce/shipping_management/extend_shipping.md index d33574333f..f194bb1fea 100644 --- a/docs/commerce/shipping_management/extend_shipping.md +++ b/docs/commerce/shipping_management/extend_shipping.md @@ -174,5 +174,5 @@ You should now see the parameter, in this case it's a customer identifier, displ !!! note "Non-matching label" - This section does not discuss overriding the default form, therefore the alphanumerical customer identifier is shown under the **Cost value** label. + This section doesn't discuss overriding the default form, therefore the alphanumerical customer identifier is shown under the **Cost value** label. For more information about working with forms, see [Page and Form tutorial](../../tutorials/page_and_form_tutorial/5_create_newsletter_form.md). diff --git a/docs/commerce/transactional_emails/transactional_emails.md b/docs/commerce/transactional_emails/transactional_emails.md index 954d28f8a7..fc12a81e83 100644 --- a/docs/commerce/transactional_emails/transactional_emails.md +++ b/docs/commerce/transactional_emails/transactional_emails.md @@ -77,7 +77,7 @@ For a complete list of parameters, see [Transactional email variables reference] !!! Tip - When you invent names for your campaigns, keep them simple, and do not use special characters or spaces. + When you invent names for your campaigns, keep them simple, and don't use special characters or spaces. Campaign emails can be sent in one language only. diff --git a/docs/content_management/content_availability.md b/docs/content_management/content_availability.md index 650665b59d..9b3ac0ebe4 100644 --- a/docs/content_management/content_availability.md +++ b/docs/content_management/content_availability.md @@ -14,7 +14,7 @@ It's automatically applied to any new content item of this Type. A content item with this flag is available in its main language even if it's not translated into the language of the current SiteAccess. -Without the flag, a content item isn't available at all if it does not have a language version +Without the flag, a content item isn't available at all if it doesn't have a language version corresponding to the current SiteAccess. !!! note diff --git a/docs/content_management/content_management_guide.md b/docs/content_management/content_management_guide.md index 4f79454b8d..17957e1354 100644 --- a/docs/content_management/content_management_guide.md +++ b/docs/content_management/content_management_guide.md @@ -190,7 +190,7 @@ You can divide your content tree into nominal parts to better organize it. Once you have defined sections, for example, Media or Forms, and assigned them to content items, you can decide which roles have access to which Section of the tree. The setting is inherited, which means that a child content item inherits a value of this setting from its parent. -Changing a Section setting does not result in moving a content item to a different location within a content tree. +Changing a Section setting doesn't result in moving a content item to a different location within a content tree. ![Members of the Media Section](img/sections.png) diff --git a/docs/content_management/content_model.md b/docs/content_management/content_model.md index 429b5ac338..06e9bb7fce 100644 --- a/docs/content_management/content_model.md +++ b/docs/content_management/content_model.md @@ -12,7 +12,7 @@ Each content item is an instance of a content type. !!! tip - An introduction to the content model for non-developer users is available in [[[= product_name =]] user documentation](https://doc.ibexa.co/projects/userguide/en/latest/content_management/content_model/). + An introduction to the content model for non-developer users is available in [[[= product_name =]] User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/content_management/content_model/). ## Content items @@ -25,7 +25,7 @@ The fields can cover data ranging from single variables and text lines to media #### Content information General information about a content item is stored in a [`ContentInfo`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html) object. -`ContentInfo` does not include fields. It contains following information: +`ContentInfo` doesn't include fields. It contains following information: **`id`** - the unique ID of the Content object. These numbers aren't recycled, so if an item is deleted, its ID isn't reused when a new one is created. @@ -41,7 +41,8 @@ The name is in the main language of the content item. **`sectionId`** - the unique number of the Section to which the content item belongs. New content items are placed in the Standard Section by default. This behavior can be changed, but content must always belong to some Section. -See [Sections](sections.md) for more information. + +For more information, see [Sections](sections.md). **`currentVersionNo`** - current version number is the number of the published version or of a newly created draft (which is 1). @@ -109,7 +110,7 @@ Aside from the field type, the field definition in a content type provides the f **[Searchable](search.md)** – a flag which indicates if the value of the field is indexed for searching. -The Searchable flag isn't available for some fields, because some field types do not allow searching through their values. +The Searchable flag isn't available for some fields, because some field types don't allow searching through their values. **[Translatable](languages.md)** – a flag which indicates if the value of the field can be translated. It's independent of the field type, which means that even fields such as "Float" or "Image" can be set as translatable. @@ -140,4 +141,4 @@ A new version is also created when a new [language](languages.md) is added to th Products are a special type of content that holds products you can manage in the built-in PIM system. -See [PIM](pim.md) for more information. +For more information, see [PIM](pim.md). diff --git a/docs/content_management/data_migration/exporting_data.md b/docs/content_management/data_migration/exporting_data.md index d2969cac0e..b0169e7d13 100644 --- a/docs/content_management/data_migration/exporting_data.md +++ b/docs/content_management/data_migration/exporting_data.md @@ -161,7 +161,7 @@ The following types are available: - `segment_group` - `company` -If you do not provide the `--type` option, the command asks you to select a type of data. +If you don't provide the `--type` option, the command asks you to select a type of data. ## mode @@ -172,7 +172,7 @@ The following modes are available: - `update` - updates an existing item. Only covers specified fields and properties. If the item does not exist, causes an error. - `delete` - deletes an existing item. If the item does not exist, causes an error. -If you do not provide the `--mode` option, the command asks you to select the mode. +If you don't provide the `--mode` option, the command asks you to select the mode. The following combinations of types are modes are available: diff --git a/docs/content_management/data_migration/managing_migrations.md b/docs/content_management/data_migration/managing_migrations.md index a1d71dae93..0a1223b905 100644 --- a/docs/content_management/data_migration/managing_migrations.md +++ b/docs/content_management/data_migration/managing_migrations.md @@ -24,7 +24,7 @@ You can also convert multiple files using `ibexa:migrations:kaliop:bulk-convert` php bin/console ibexa:migrations:kaliop:bulk-convert --recursive kaliop_files ibexa_files ``` -If you do not specify the output folder, the command overwrites the input files. +If you don't specify the output folder, the command overwrites the input files. ## Adding migration files diff --git a/docs/content_management/field_types/create_custom_generic_field_type.md b/docs/content_management/field_types/create_custom_generic_field_type.md index 835085a9f2..e97f21329c 100644 --- a/docs/content_management/field_types/create_custom_generic_field_type.md +++ b/docs/content_management/field_types/create_custom_generic_field_type.md @@ -19,7 +19,7 @@ reduces the number of classes which must be created, and simplifies the tagging First, create `Value.php` in the `src/FieldType/HelloWorld` directory. The Value class of a field type contains only the basic logic of a field type, the rest of it's handled by the `Type` class. -For more information about field type Value see [Value handling](type_and_value.md#value-handling). +For more information about field type Value, see [Value handling](type_and_value.md#value-handling). The `HelloWorld` Value class should contain: @@ -39,9 +39,7 @@ It provides settings for the field type and an implementation of the `Ibexa\Cont [[= include_file('code_samples/field_types/generic_ft/src/FieldType/HelloWorld/Type.php', 0, 6) =]][[= include_file('code_samples/field_types/generic_ft/src/FieldType/HelloWorld/Type.php', 9, 16) =]]} ``` -!!! tip - - For more information about the Type class of a field type, see [Type class](type_and_value.md#type-class). +For more information about the Type class of a field type, see [Type class](type_and_value.md#type-class). Next, register the field type as a service and tag it with `ibexa.field_type`: @@ -66,9 +64,7 @@ and the required `use` statements to `src/FieldType/HelloWorld/Type.php`: [[= include_file('code_samples/field_types/generic_ft/src/FieldType/HelloWorld/Type.php') =]] ``` -!!! tip - - For more information about the FormMappers see [field type form and template](form_and_template.md). +For more information about the FormMappers, see [field type form and template](form_and_template.md). Next, add the `ibexa.admin_ui.field_type.form.mapper.value` tag to the service definition: diff --git a/docs/content_management/field_types/field_type_reference/formfield.md b/docs/content_management/field_types/field_type_reference/formfield.md index ab5ae4e867..00a3081439 100644 --- a/docs/content_management/field_types/field_type_reference/formfield.md +++ b/docs/content_management/field_types/field_type_reference/formfield.md @@ -12,4 +12,4 @@ The Form field type stores a Form consisting of one or more form fields. -See [Forms](work_with_forms.md) for more information about working with Forms. +For more information about working with Forms, see [Forms](work_with_forms.md). diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index 7197585793..f87c690ab5 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -238,7 +238,7 @@ The REST API expects field values to be provided in a hash-like structure. Those ### Updating an Image field -Updating an Image field requires that you re-send existing data. This can be done by re-using the field obtained via REST, **removing the variations key**, and updating `alternativeText`, `fileName` or `data`. If you do not want to change the image itself, do not provide the `data` key. +Updating an Image field requires that you re-send existing data. This can be done by re-using the field obtained via REST, **removing the variations key**, and updating `alternativeText`, `fileName` or `data`. If you don't want to change the image itself, don't provide the `data` key. ``` xml diff --git a/docs/content_management/field_types/field_types.md b/docs/content_management/field_types/field_types.md index 9979d30106..46af661cff 100644 --- a/docs/content_management/field_types/field_types.md +++ b/docs/content_management/field_types/field_types.md @@ -25,7 +25,7 @@ available in the [`Ibexa\Core\FieldType`](https://github.com/ibexa/core/tree/mai !!! note "Registration" Remember that all your custom field types must be registered in `config/services.yml`. - For more information see [Registration](type_and_value.md#registration). + For more information, see [Registration](type_and_value.md#registration). To provide custom functionality for a field type, the SPI interacts with multiple layers of the [[= product_name =]] architecture: diff --git a/docs/content_management/field_types/form_and_template.md b/docs/content_management/field_types/form_and_template.md index 9ce61fc79b..5d9546206a 100644 --- a/docs/content_management/field_types/form_and_template.md +++ b/docs/content_management/field_types/form_and_template.md @@ -188,7 +188,7 @@ For templates for previewing the field in the back office, using the design engine is recommended with `ibexa_standard_design.override_kernel_templates` set to `true`. With the design engine you can apply a template (e.g. `Resources/views/themes/admin/content_fields.html.twig`) without any extra configuration. -If you do not use the design engine, apply the following configuration: +If you don't use the design engine, apply the following configuration: ``` yaml ibexa: @@ -219,6 +219,4 @@ All built-in field types are implemented with this approach. In that case overri {% endblock %} ``` -!!! tip - - For more information on creating and overriding form type templates, see [Symfony documentation]([[= symfony_doc =]]/form/create_custom_field_type.html#creating-the-form-type-template). +For more information on creating and overriding form type templates, see [Symfony documentation]([[= symfony_doc =]]/form/create_custom_field_type.html#creating-the-form-type-template). diff --git a/docs/content_management/file_management/file_url_handling.md b/docs/content_management/file_management/file_url_handling.md index 442fce0fdc..6f868461ca 100644 --- a/docs/content_management/file_management/file_url_handling.md +++ b/docs/content_management/file_management/file_url_handling.md @@ -36,7 +36,7 @@ ibexa: !!! caution - For security reasons, do not map `/path/to/ibexa/public/` as + For security reasons, don't map `/path/to/ibexa/public/` as Document Root of the static server. Map the `/var/` directory directly to `/path/to/ibexa/public/var` instead. diff --git a/docs/content_management/forms/work_with_forms.md b/docs/content_management/forms/work_with_forms.md index a855fc9a05..aa873ccc63 100644 --- a/docs/content_management/forms/work_with_forms.md +++ b/docs/content_management/forms/work_with_forms.md @@ -41,7 +41,8 @@ For information about available options, see [Gregwar/CaptchaBundle's documentat !!! note - If your installation uses Varnish to manage content cache, you must modify the configuration to avoid issues with the Captcha field. For more information, see [Ensure proper captcha behavior](reverse_proxy.md#ensure-proper-captcha-behavior). + If your installation uses Varnish to manage content cache, you must modify the configuration to avoid issues with the Captcha field. + For more information, see [Ensure proper captcha behavior](reverse_proxy.md#ensure-proper-captcha-behavior). ## Form submission purging diff --git a/docs/content_management/images/add_image_asset_from_dam.md b/docs/content_management/images/add_image_asset_from_dam.md index 11b6b748e5..87c4246d56 100644 --- a/docs/content_management/images/add_image_asset_from_dam.md +++ b/docs/content_management/images/add_image_asset_from_dam.md @@ -43,7 +43,8 @@ First, in `templates/themes/standard/embed/`, create a custom template `dam.html The `770px` parameter in the template above is used to render the DAM image. It's the `unsplash` specific image variation and must be defined separately. -Next, in `config/packages/ibexa.yaml`, set the `dam.html.twig` template for the `embed` view type that is matched for the content type, which you created for DAM images. +Next, in `config/packages/ibexa.yaml`, set the `dam.html.twig` template for the `embed` view type that is matched for the content type, which you created for DAM images. + For more information about displaying content, see [Content rendering](render_content.md). ``` yaml @@ -72,7 +73,8 @@ dam_unsplash: fit: max ``` -You can customize the parameters according to your needs. +You can customize the parameters according to your needs. + For more information about supported parameters, see the [Unsplash documentation](https://unsplash.com/documentation#dynamically-resizable-images). In the back office, go to **Admin** > **Content types**. diff --git a/docs/content_management/images/configure_image_editor.md b/docs/content_management/images/configure_image_editor.md index 3e6688f525..354a0fb771 100644 --- a/docs/content_management/images/configure_image_editor.md +++ b/docs/content_management/images/configure_image_editor.md @@ -5,7 +5,8 @@ description: Configure image editor to crop, flip, and modify images. # Configure Image Editor When a content item contains fields of the [ezimage](imageassetfield.md) type, users can perform basic image editing functions with the Image Editor. -For more information, see the [user documentation]([[= user_doc =]]/editing_images/). + +For more information, see [User Documentation]([[= user_doc =]]/editing_images/). !!! note diff --git a/docs/content_management/images/fastly_io.md b/docs/content_management/images/fastly_io.md index 959c4891a9..6240abda89 100644 --- a/docs/content_management/images/fastly_io.md +++ b/docs/content_management/images/fastly_io.md @@ -13,8 +13,8 @@ To be able to configure this feature, you need [Fastly IO subscription](https:// To use Fastly Image Optimizer, you first need a [working setup of [[= product_name =]] and Fastly](reverse_proxy.md#using-varnish-or-fastly) with shielding enabled. -To enable shielding, follow the steps in [Fastly developer documentation](https://developer.fastly.com/learning/concepts/shielding/#enabling-and-disabling-shielding). -Remember to choose a shield location from the **Shielding** menu, as described in [Fastly user documentation](https://docs.fastly.com/en/guides/shielding#enabling-shielding). +To enable shielding, follow the steps in [Fastly Developer Documentation](https://developer.fastly.com/learning/concepts/shielding/#enabling-and-disabling-shielding). +Remember to choose a shield location from the **Shielding** menu, as described in [Fastly User Documentation](https://docs.fastly.com/en/guides/shielding#enabling-shielding). ## VCL configuration diff --git a/docs/content_management/images/images.md b/docs/content_management/images/images.md index 4ccbc325fa..4567e63dc1 100644 --- a/docs/content_management/images/images.md +++ b/docs/content_management/images/images.md @@ -56,6 +56,7 @@ Image files are stored by using the `IOService,` and are completely independent they're generated only once and cleared on demand, for example, on content removal). LiipImagineBundle only works on image blobs, so no command line tool is needed. + For more information, see the [bundle's documentation](https://symfony.com/bundles/LiipImagineBundle/current/configuration.html). !!! caution "Code injection in image EXIF" @@ -68,6 +69,7 @@ For more information, see the [bundle's documentation](https://symfony.com/bundl You can use LiipImagine's `liip:imagine:cache:resolve` command to resolve the path to image variations that are generated from the original image, with one or more paths as arguments. Paths to repository images must be relative to the `var//storage/images` directory, for example: `7/4/2/0/247-1-eng-GB/test.jpg`. + For more information, see [LiipImagineBundle documentation](https://symfony.com/bundles/LiipImagineBundle/current/basic-usage.html#resolve-with-the-console). ## Resizing images diff --git a/docs/content_management/pages/ibexa_connect_scenario_block.md b/docs/content_management/pages/ibexa_connect_scenario_block.md index 7097265c9c..872e5ad8a5 100644 --- a/docs/content_management/pages/ibexa_connect_scenario_block.md +++ b/docs/content_management/pages/ibexa_connect_scenario_block.md @@ -2,7 +2,7 @@ description: Work with Ibexa Connect scenario block that retrieves and displays data from an Ibexa Connect webhook. --- -# Ibexa Connect scenario block +# [[= product_name_connect =]] scenario block [[= product_name_connect =]] scenario block retrieves and displays data from an [[= product_name_connect =]] webhook. Scenario block is a regular [Page block](page_blocks.md) and can be configured on field definition level as any other block. @@ -49,7 +49,7 @@ Then, in `templates/blocks` directory under `default.html.twig`, provide your bl In the following example, the configuration of the block is non-complex - block is only used to display the content transferred from an [[= product_name_connect =]] webhook. At this point the [[= product_name_connect =]] scenario block is ready to be used in Page Builder. -### Configure Ibexa Connect scenario block in Page Builder +### Configure [[= product_name_connect =]] scenario block in Page Builder Now, you can configure [[= product_name_connect =]] scenario block in Page Builder. To do it, in your Page add [[= product_name_connect =]] block by dragging it from the menu to a drop zone and enter block settings. diff --git a/docs/content_management/pages/page_block_attributes.md b/docs/content_management/pages/page_block_attributes.md index 426ae901ca..77f0b152c6 100644 --- a/docs/content_management/pages/page_block_attributes.md +++ b/docs/content_management/pages/page_block_attributes.md @@ -51,6 +51,7 @@ attributes: `embed` and `locationlist` use the Universal Discovery Widget (UDW). When creating a block with these two types you can configure the UDW behavior. + For more information, see [Create custom page block / Add edit template](create_custom_page_block.md#add-edit-template) ## Custom attribute types diff --git a/docs/content_management/pages/page_block_validators.md b/docs/content_management/pages/page_block_validators.md index 1064200e00..f5f28c3eb7 100644 --- a/docs/content_management/pages/page_block_validators.md +++ b/docs/content_management/pages/page_block_validators.md @@ -16,7 +16,7 @@ The following block validators are available: !!! note - Do not use the `required` and `not_blank` validators for `richtext` attributes. + Don't use the `required` and `not_blank` validators for `richtext` attributes. Instead, use `not_blank_richtext`. For each validator you can provide a message that displays in the Page Builder diff --git a/docs/content_management/pages/page_builder_guide.md b/docs/content_management/pages/page_builder_guide.md index 55de800b46..ed97a9c6c3 100644 --- a/docs/content_management/pages/page_builder_guide.md +++ b/docs/content_management/pages/page_builder_guide.md @@ -85,7 +85,9 @@ F. Saving options |Save draft|Save the page draft*.| |Delete draft|Delete the page draft.| -*To help you preserve your work, system saves drafts of content items automatically. For more information, see [Autosave]([[= user_doc =]]/content_management/content_versions/#autosave). +*To help you preserve your work, system saves drafts of content items automatically. + +For more information, see [Autosave]([[= user_doc =]]/content_management/content_versions/#autosave). Page Builder has two main views that you can use while creating a page: @@ -112,6 +114,7 @@ In the `Select layouts` section, you can select layouts that you want to be avai ![Switch layout](switch_layout_window.png) The default, built-in Page layout has only one zone, but developers can create other layouts in configuration. + For more information, see [Configure layout](render_page.md#configure-layout). #### Add blocks diff --git a/docs/content_management/rich_text/create_custom_richtext_block.md b/docs/content_management/rich_text/create_custom_richtext_block.md index 672c6d4a6c..85f7c26cfe 100644 --- a/docs/content_management/rich_text/create_custom_richtext_block.md +++ b/docs/content_management/rich_text/create_custom_richtext_block.md @@ -75,5 +75,4 @@ You can now add your block in the Site tab. ![RichText block](extending_richtext_block.png) -For more information about customizing additional options of the block or creating -custom blocks with other attribute types, see [Create custom Page block](create_custom_page_block.md). +For more information about customizing additional options of the block or creating custom blocks with other attribute types, see [Create custom Page block](create_custom_page_block.md). diff --git a/docs/content_management/rich_text/extend_online_editor.md b/docs/content_management/rich_text/extend_online_editor.md index 8b285ef127..4ec598a2aa 100644 --- a/docs/content_management/rich_text/extend_online_editor.md +++ b/docs/content_management/rich_text/extend_online_editor.md @@ -14,6 +14,7 @@ and creating [custom buttons](https://ckeditor.com/docs/ckeditor4/latest/guide/w Online Editor is based on the CKEditor5. Refer to [CKEditor5 documentation](https://ckeditor.com/docs/ckeditor5/latest/index.html) to learn how you can extend the Online Editor with even more elements. + For more information about extending the back office, see [Extend back office](back_office.md). ## Configure custom tags diff --git a/docs/content_management/rich_text/online_editor_guide.md b/docs/content_management/rich_text/online_editor_guide.md index 6687e9e979..ff5ecdc735 100644 --- a/docs/content_management/rich_text/online_editor_guide.md +++ b/docs/content_management/rich_text/online_editor_guide.md @@ -59,7 +59,7 @@ See [Extend Online Editor](extend_online_editor.md#configure-custom-tags) for a Custom styles allow specifying custom predefined templates for specific RichText elements. -Custom styles differ from custom tags in that they do not have attributes configured. A custom style requires YAML configuration that points to a template used to render an elements with this style. +Custom styles differ from custom tags in that they don't have attributes configured. A custom style requires YAML configuration that points to a template used to render an elements with this style. See [Extend Online Editor](extend_online_editor.md#configure-custom-styles) for a full example. @@ -69,11 +69,11 @@ For each RichText element type, you can configure custom data attributes or CSS Custom data attributes allow adding new attributes to existing Rich Text elements, such as headings or lists, which are added in the form of `data-ezattribute-=""`. -See [Extend Online Editor](extend_online_editor.md#custom-data-attributes) for more information +For more information, see [Extend Online Editor](extend_online_editor.md#custom-data-attributes). Custom CSS classes work in a similar way, giving editor a choice of classes to add to any type of element. -See [Extend Online Editor](extend_online_editor.md#custom-css-classes) for more information +For more information, see [Extend Online Editor](extend_online_editor.md#custom-css-classes). ### Plugins diff --git a/docs/customer_management/cp_configuration.md b/docs/customer_management/cp_configuration.md index f680379290..d615d19d00 100644 --- a/docs/customer_management/cp_configuration.md +++ b/docs/customer_management/cp_configuration.md @@ -94,4 +94,5 @@ ibexa: Reviewing pending and past orders in Customer Portal requires that you configure all currencies that any of the customers may use under the `ibexa.system..product_catalog.currencies` key. The first currency from the list is then used for filtering the orders list and calculating the **Average order** and **Total amount** values. + For more information, see [Enable purchasing products](enable_purchasing_products.md). \ No newline at end of file diff --git a/docs/getting_started/first_steps.md b/docs/getting_started/first_steps.md index dfd2a8e8fa..dceb94d924 100644 --- a/docs/getting_started/first_steps.md +++ b/docs/getting_started/first_steps.md @@ -39,8 +39,7 @@ module.exports = [ eZConfig, ibexaConfig, ...customConfigs ]; !!! caution "Password change" - Make sure that you change the default password before you switch your installation - from development to production. + Make sure that you change the default password before you switch your installation from development to production. For more information about passwords, see [Passwords](passwords.md). For more information about production security, see [Security checklist](security_checklist.md). @@ -60,9 +59,7 @@ module.exports = [ eZConfig, ibexaConfig, ...customConfigs ]; 8\. Save the content type. -!!! tip "More information" - - - [Content model](content_model.md) +For more information, see [Content model](content_model.md). ## Create Twig templates and match then with view config @@ -92,10 +89,7 @@ Content view templates use the [Twig templating engine](https://twig.symfony.com
{{ ibexa_render_field(content, 'text') }}
``` -!!! tip "More information" - - - [Templates](templates.md) - - [Twig documentation](https://twig.symfony.com/doc/3.x/) +For more information, see [Templates](templates.md) and [Twig documentation](https://twig.symfony.com/doc/3.x/). ## Create content and test view templates @@ -139,10 +133,7 @@ The SiteAccess is automatically matched using the last part of the URI. For now the new SiteAccess does not differ from the main site. -!!! tip "More information" - - - [Multisite](multisite.md) - - [SiteAccess matchers](siteaccess_matching.md#available-siteaccess-matchers) +For more information, see [Multisite](multisite.md) and [SiteAccess matchers](siteaccess_matching.md#available-siteaccess-matchers). ## Add a language and translate Content @@ -179,10 +170,7 @@ Switch to the **Translations** tab and add a new translation. ![Previewing translated Content](first-steps-translated-content.png) -!!! tip "More information" - - - [Languages](languages.md) - - [Set up translation SiteAccess](set_up_translation_siteaccess.md) +For more information, see [Languages](languages.md) and [Set up translation SiteAccess](set_up_translation_siteaccess.md). ## Add a design @@ -256,6 +244,4 @@ Call the group "Bloggers". You can now log out and log in again as the new User. You're able to create Blog Posts only. -!!! tip "More information" - - - [Permissions](permissions.md) +For more information, see [Permissions](permissions.md). diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md index 90b22f389d..507123f870 100644 --- a/docs/getting_started/install_ibexa_dxp.md +++ b/docs/getting_started/install_ibexa_dxp.md @@ -14,7 +14,7 @@ description: Install Ibexa DXP on a Linux system and prepare your installation f !!! note "Installing [[= product_name_oss =]]" This installation guide shows in details how to install [[= product_name =]] for users who have a subscription agreement with [[= product_name_base =]]. - If you want to install [[= product_name_oss =]], you do not need authentication tokens or an account on updates.ibexa.co, + If you want to install [[= product_name_oss =]], you don't need authentication tokens or an account on updates.ibexa.co, but must adapt the steps shown here to the product edition and the `ibexa/oss-skeleton` repository. ## Prepare work environment @@ -227,12 +227,13 @@ and for creating signed URIs when using [ESI (Edge Side Includes)]([[= symfony_d php -r "print bin2hex(random_bytes(32));" ``` - Do not commit the secret to version control systems, or share it with anyone who does not strictly need it. + Don't commit the secret to version control systems, or share it with anyone who does not strictly need it. If you have any suspicion that the secret may have been exposed, replace it with a new one. The same goes for other secrets, like database password, Varnish invalidate token, JWT passphrase, etc. After changing the app secret, make sure that you clear the application cache and log out all the users. - For more information, see [Symfony documentation]([[= symfony_doc =]]/reference/configuration/framework.html#secret). + + For more information, see [Symfony documentation]([[= symfony_doc =]]/reference/configuration/framework.html#secret). It's recommended to store the database credentials in your `.env.local` file and not commit it to the Version Control System. @@ -434,6 +435,6 @@ Finally, remove the temporary file: To make use of the [Link Manager](url_management.md#enabling-automatic-url-validation). -## Ibexa Cloud +## [[= product_name_cloud =]] -If you want to host your application on [[= product_name_cloud =]], follow the [Install on Ibexa Cloud](install_on_ibexa_cloud.md) procedure. +If you want to host your application on [[= product_name_cloud =]], follow the [Install on [[= product_name_cloud =]]](install_on_ibexa_cloud.md) procedure. diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index 4d39312782..09572891be 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -412,12 +412,12 @@ If the local project needs to answer to real production domains (for example, to As this feature modifies domain resolution, the real website may be unreachable until the `hosts` file is manually cleaned. -### Cluster or Ibexa Cloud +### Cluster or [[= product_name_cloud =]] DDEV can be useful to locally simulate a production cluster. - See [clustering with DDEV](clustering_with_ddev.md) to add Elasticsearch, Solr, Redis or Memcached to your DDEV installation. -- See [DDEV and Ibexa Cloud](ddev_and_ibexa_cloud.md) to locally run an [[= product_name =]] project by using DDEV. +- See [DDEV and [[= product_name_cloud =]]](ddev_and_ibexa_cloud.md) to locally run an [[= product_name =]] project by using DDEV. ## Stop or remove the project diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index 15aa503e90..addc377f6f 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -11,9 +11,9 @@ To review the requirements, select the specific version of [[= product_name =]] The following server requirements cover both running the software on-premise and on third-party PaaS providers. -!!! note "Ibexa Cloud" +!!! note "[[= product_name_cloud =]]" - For running on [Ibexa Cloud](https://www.ibexa.co/products/ibexa-cloud), where recommended configuration and support is provided out of the box, see separate [Ibexa Cloud section](#ibexa-cloud-requirements-and-setup) for further reading on its requirements. + For running on [[[= product_name_cloud =]]](https://www.ibexa.co/products/ibexa-cloud), where recommended configuration and support is provided out of the box, see separate [[[= product_name_cloud =]] section](#ibexa-cloud-requirements-and-setup) for further reading on its requirements. The minimal setup requires PHP, MySQL/MariaDB, Apache/Nginx, Node.js and `yarn`. Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, NFS/EFS/S3 and Solr/Elasticsearch in a [clustered setup](clustering.md). @@ -360,36 +360,36 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Chromium™ based browsers such as Microsoft® Edge® and Opera®, most recent stable version, desktop *and* tablet - Apple® Safari® most recent stable version, desktop *and* tablet -## Ibexa Cloud requirements and setup +## [[= product_name_cloud =]] requirements and setup -=== "Ibexa Cloud v4.6" +=== "[[= product_name_cloud =]] v4.6" - ### Cloud hosting with Ibexa Cloud and Platform.sh + ### Cloud hosting with [[= product_name_cloud =]] and Platform.sh - In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. + In general, [[= product_name_cloud =]] supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). - ### Ibexa Cloud Setup support matrix + ### [[= product_name_cloud =]] Setup support matrix - All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. + All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. !!! note As Platform.sh does not support a configuration with multiple PostgreSQL databases, - for Ibexa Cloud / Platform.sh it's impossible to have a DFS table in a separate database. + for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. - ### Recommended Ibexa Cloud setup + ### Recommended [[= product_name_cloud =]] setup For more details on recommended setup configuration see bundled `.platform.app.yaml` and `.platform/` configuration files. These files are kept up-to-date with latest recommendations and can be improved through contributions. - ### Supported Ibexa Cloud setup + ### Supported [[= product_name_cloud =]] setup Because of the large range of possible configurations of [[= product_name =]], there are many possibilities beyond what is provided in the default recommended configuration. @@ -399,7 +399,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Additional time for adaptation and configuration work, and testing by your development team - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with [[= product_name =]] - The cost and effort of this isn't included in Ibexa Cloud subscription and is vary depending on the project. + The cost and effort of this isn't included in [[= product_name_cloud =]] subscription and is vary depending on the project. ### Custom integrations @@ -409,34 +409,34 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. -=== "Ibexa Cloud v3.3" +=== "[[= product_name_cloud =]] v3.3" - ### Cloud hosting with Ibexa Cloud and Platform.sh + ### Cloud hosting with [[= product_name_cloud =]] and Platform.sh - In general, Ibexa Cloud supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. + In general, [[= product_name_cloud =]] supports all features and services of [Platform.sh](https://platform.sh/marketplace/ibexa/) that are compatible and supported by the [[= product_name =]] version you use. For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on Ibexa Cloud in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). - ### Ibexa Cloud Setup support matrix + ### [[= product_name_cloud =]] Setup support matrix - All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on Ibexa Cloud either. + All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. !!! note As Platform.sh does not support a configuration with multiple PostgreSQL databases, - for Ibexa Cloud / Platform.sh it's impossible to have a DFS table in a separate database. + for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. - ### Recommended Ibexa Cloud setup + ### Recommended [[= product_name_cloud =]] setup For more details on recommended setup configuration see bundled `.platform.app.yaml` and `.platform/` configuration files. These files are kept up-to-date with latest recommendations and can be improved through contributions. - ### Supported Ibexa Cloud setup + ### Supported [[= product_name_cloud =]] setup Because of the large range of possible configurations of [[= product_name =]], there are many possibilities beyond what is provided in the default recommended configuration. @@ -446,7 +446,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Additional time for adaptation and configuration work, and testing by your development team - Additional consulting/onboarding time with Platform.sh, Ibexa technical services, and/or one of the many partners with prior experience using Platform.sh with [[= product_name =]] - The cost and effort of this isn't included in Ibexa Cloud subscription and is vary depending on the project. + The cost and effort of this isn't included in [[= product_name_cloud =]] subscription and is vary depending on the project. ### Custom integrations diff --git a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md index c69a2e6d6a..03be4210d6 100644 --- a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md +++ b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md @@ -2,7 +2,7 @@ description: Use DDEV to run an Ibexa Cloud project locally. --- -# DDEV and Ibexa Cloud +# DDEV and [[= product_name_cloud =]] Two ways are available to run an [[= product_name_cloud =]] project locally with DDEV: @@ -11,7 +11,7 @@ Two ways are available to run an [[= product_name_cloud =]] project locally with !!! note - The following examples use [Ibexa Cloud CLI (`ibexa_cloud`)](https://cli.ibexa.co/). + The following examples use [[[= product_name_cloud =]] CLI (`ibexa_cloud`)](https://cli.ibexa.co/). ## With the `ddev-platformsh` add-on diff --git a/docs/ibexa_cloud/install_on_ibexa_cloud.md b/docs/ibexa_cloud/install_on_ibexa_cloud.md index 6d1d10fa88..fc842e7bbb 100644 --- a/docs/ibexa_cloud/install_on_ibexa_cloud.md +++ b/docs/ibexa_cloud/install_on_ibexa_cloud.md @@ -2,7 +2,7 @@ description: Install and configure Ibexa DXP to run in cloud using Ibexa Cloud. --- -# Install on Ibexa Cloud +# Install on [[= product_name_cloud =]] [[= product_name_cloud =]] enables you to host your application in the cloud by using the [Platform.sh](https://platform.sh/) service. @@ -85,7 +85,7 @@ When you're done with configuration, push your project to the Platform.sh remote git push -u master ``` -You can also use the [Ibexa Cloud CLI](https://cli.ibexa.cloud/) to push your code. +You can also use the [[[= product_name_cloud =]] CLI](https://cli.ibexa.cloud/) to push your code. ``` bash ibexa_cloud push master @@ -97,11 +97,11 @@ ibexa_cloud push master !!! caution - Do not use Platform.sh CLI (`platform`), instead, use the [Ibexa Cloud CLI (`ibexa_cloud`)](https://cli.ibexa.cloud/). + Don't use Platform.sh CLI (`platform`), instead, use the [[[= product_name_cloud =]] CLI (`ibexa_cloud`)](https://cli.ibexa.cloud/). - To install Ibexa Cloud CLI, follow https://cli.ibexa.cloud/ "Installation instructions". + To install [[= product_name_cloud =]] CLI, follow https://cli.ibexa.cloud/ "Installation instructions". - Ibexa Cloud CLI and Platform.sh CLI share the same commands and the [same documentation](https://docs.platform.sh/administration/cli.html#3-use), but you have to replace `platform` with `ibexa_cloud`. + [[= product_name_cloud =]] CLI and Platform.sh CLI share the same commands and the [same documentation](https://docs.platform.sh/administration/cli.html#3-use), but you have to replace `platform` with `ibexa_cloud`. - If you have previously set up an alias to use Platform.sh CLI with Ibexa Cloud, it's outdated. - Remove the alias and install Ibexa Cloud CLI instead. + If you have previously set up an alias to use Platform.sh CLI with [[= product_name_cloud =]], it's outdated. + Remove the alias and install [[= product_name_cloud =]] CLI instead. diff --git a/docs/ibexa_engage/create_campaign.md b/docs/ibexa_engage/create_campaign.md index e76f92e8db..afff227235 100644 --- a/docs/ibexa_engage/create_campaign.md +++ b/docs/ibexa_engage/create_campaign.md @@ -18,7 +18,7 @@ For more information about creating and managing campaigns, see [Qualifio docume ## Publication channels Each campaign includes a minimum of one publication channel that you can choose from the three options the platform provides for publishing a campaign. -For more information about publication channels, see [Publication channel]([[= user_doc =]]/ibexa_engage/ibexa_engage/#publication-channel) in the User Documentation. +For more information about publication channels, see [Publication channel]([[= user_doc =]]/ibexa_engage/ibexa_engage/#publication-channel) in User Documentation. ## Use Campaign block in Page Builder diff --git a/docs/ibexa_engage/install_ibexa_engage.md b/docs/ibexa_engage/install_ibexa_engage.md index 491688e513..3a6dd28cd1 100644 --- a/docs/ibexa_engage/install_ibexa_engage.md +++ b/docs/ibexa_engage/install_ibexa_engage.md @@ -3,7 +3,7 @@ description: Install and configure Ibexa Engage. edition: experience --- -# Ibexa Engage +# [[= product_name_engage =]] [[= product_name_engage =]] is a data collection tool. It enables you to engage your audiences by using the [Qualifio](https://qualifio.com/) tools. You can use interactive content to gather valuable data, for example, customer data or recent orders list, and create connections. @@ -15,7 +15,7 @@ For more information, see [Qualifio Developers documentation](https://developers To use [[= product_name_engage =]], you must make arrangements with [[= product_name =]] to define the initial configuration. [[= product_name_base =]] team creates and provides user account. An invitation link is sent during the setup process. -For more information, see [Ibexa Engage in User documentation]([[= user_doc =]]/ibexa_engage/ibexa_engage/#request-access). +For more information, see [[[= product_name_engage =]] in User Documentation]([[= user_doc =]]/ibexa_engage/ibexa_engage/#request-access). ## Install [[= product_name_engage =]] diff --git a/docs/ibexa_engage/integrate_ibexa_connect.md b/docs/ibexa_engage/integrate_ibexa_connect.md index 8f1c00f6b8..c232161571 100644 --- a/docs/ibexa_engage/integrate_ibexa_connect.md +++ b/docs/ibexa_engage/integrate_ibexa_connect.md @@ -3,13 +3,13 @@ description: Integrate Ibexa Engage with Ibexa Connect. edition: experience --- -# Use Ibexa Connect +# Use [[= product_name_connect =]] -You can create workflows using [Ibexa Connect](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_connect/). +You can create workflows using [[[= product_name_connect =]]](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_connect/). [[= product_name_engage =]] collects user data and passes it directly to [[= product_name_connect =]]. With this data, you can create scenarios, for example, to add a user to newsletter, or to specific user segment group. -For more information, see [Ibexa Connect documentation](https://doc.ibexa.co/projects/connect/en/latest/). +For more information, see [[[= product_name_connect =]] documentation](https://doc.ibexa.co/projects/connect/en/latest/). ## Integrate [[= product_name_engage =]] with [[= product_name_connect =]] diff --git a/docs/ibexa_products/editions.md b/docs/ibexa_products/editions.md index f23b56d9a7..3ab8f47700 100644 --- a/docs/ibexa_products/editions.md +++ b/docs/ibexa_products/editions.md @@ -45,7 +45,7 @@ Compare all features available in [[= product_name_headless =]], [[= product_nam | [Customer Portal](customer_portal_guide.md) | | ✔ | ✔ | | [Segments](segments_admin_panel.md) | | ✔ | ✔ | | [Recent activity](recent_activity.md) | | ✔ | ✔ | -| [Ibexa Engage add-on]([[= user_doc =]]/ibexa_engage/ibexa_engage/) | | ✔ | ✔ | +| [[[= product_name_engage =]] add-on]([[= user_doc =]]/ibexa_engage/ibexa_engage/) | | ✔ | ✔ | | [Customer Data Platform (CDP) add-on](cdp_guide.md) | | ✔ | ✔ | | [Order management](order_management.md) | | | ✔ | | [Payment management](payment.md) | | | ✔ | diff --git a/docs/ibexa_products/ibexa_commerce.md b/docs/ibexa_products/ibexa_commerce.md index af76988d45..9970b8efec 100644 --- a/docs/ibexa_products/ibexa_commerce.md +++ b/docs/ibexa_products/ibexa_commerce.md @@ -20,6 +20,7 @@ You can completely revamp your online stores and give your consumers exceptional ## Availability To start using [[= product_name_com =]], you need to purchase a product license. + For more information, see [[[= product_name_com =]] license pricing](https://www.ibexa.co/products/pricing?tab=3). You can also [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [one of our partners](https://www.ibexa.co/partners). @@ -32,7 +33,7 @@ With an active license, you can start the [installation process](install_ibexa_d [[= product_name_com =]] is based on [Symfony]([[= symfony_doc =]]). With a help of documentation and trainings, any developer familiar with Symfony or even PHP alone can learn how to use available extension points and extend the platform. -Version control systems and environment variables allow you to deploy your extensions and settings on several environments, such as [Ibexa Cloud](ibexa_cloud_guide.md). +Version control systems and environment variables allow you to deploy your extensions and settings on several environments, such as [[[= product_name_cloud =]]](ibexa_cloud_guide.md). [[= product_name_com =]] is built on [[[= product_name_exp =]]](ibexa_experience.md) and includes all bundles, APIs, and features that come with both [Headless](ibexa_headless.md#core-features) and [Experience](ibexa_experience.md#core-features) editions. diff --git a/docs/ibexa_products/ibexa_experience.md b/docs/ibexa_products/ibexa_experience.md index 321ec21b00..d87d502eb4 100644 --- a/docs/ibexa_products/ibexa_experience.md +++ b/docs/ibexa_products/ibexa_experience.md @@ -18,6 +18,7 @@ It also provides tools for using segmentation and targeting, and it can be widel ## Availability To start using [[= product_name_exp =]], you need to purchase a product license. + For more information, see [[[= product_name_exp =]] license pricing](https://www.ibexa.co/products/pricing?tab=2). You can also [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [one of our partners](https://www.ibexa.co/partners). @@ -32,7 +33,7 @@ With a help of documentation and trainings, any developer familiar with Symfony [[= product_name_exp =]] is built on top of [[[= product_name_headless =]]](ibexa_headless.md), therefore it includes all bundles, APIs, and [features that come with Headless edition](ibexa_headless.md#core-features), but also more advanced features for digital experience management. -Version control systems and environment variables allow you to deploy your projects and settings on several environments, such as Ibexa Cloud. +Version control systems and environment variables allow you to deploy your projects and settings on several environments, such as [[= product_name_cloud =]]. ## Capabilities and benefits @@ -102,7 +103,7 @@ You can assign users to different recommendation groups and create advanced logi #### Customer Data Platform (CDP) -[Ibexa CDP](cdp_guide.md) is an add-on available for both Experience and [Commerce](ibexa_commerce.md) editions of [[= product_name =]]. +[[[= product_name_cdp =]]](cdp_guide.md) is an add-on available for both Experience and [Commerce](ibexa_commerce.md) editions of [[= product_name =]]. To use it, you must make arrangements with [[= product_name_base =]] to define the initial configuration. Once you activate [[= product_name_cdp =]], you can create complete customer profiles, including their interactions, behavior, and preferences. It helps you improve user engagement, conversion rates, and return on investment by segmenting your audience and delivering tailored campaigns and experiences. @@ -112,11 +113,11 @@ This central data storage supports business growth with a scalable infrastructur ![CDP](cdp.png) -#### Ibexa Engage +#### [[= product_name_engage =]] -Another add-on available for Experience and [Commerce](ibexa_commerce.md) edition is [Ibexa Engage](ibexa_engage.md). +Another add-on available for Experience and [Commerce](ibexa_commerce.md) edition is [[[= product_name_engage =]]](ibexa_engage.md). To use it, you must make arrangements with [[= product_name_base =]] to define the initial configuration, and then get and set up a user account. -Ibexa Engage is a data collection tool. +[[= product_name_engage =]] is a data collection tool. It gives you the ability to use the [Qualifio](https://qualifio.com/) tools to engage your audiences. You can use Qualifio's existing templates and interactive elements, such as quizzes, pools, and forms, to create visually appealing, customized campaigns and collect important data. To promote your campaign, you can add a Campaign block to a page in Page Builder or embed a campaign within the Rich Text field by using a Campaign custom tag. diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md index 18a6aaeb18..eecedaa13d 100644 --- a/docs/ibexa_products/ibexa_headless.md +++ b/docs/ibexa_products/ibexa_headless.md @@ -18,6 +18,7 @@ It's provided without a default front office, but with a complete back office an ## 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/about-ibexa/contact-us) or [contact one of our partners](https://www.ibexa.co/partners). diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index b94931dabb..6ea9ddbc7e 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -368,7 +368,7 @@ that .vcl code for Varnish V6.x doesn't likely work as-is on Fastly. This section describes to how to debug problems related to HTTP cache. You must be able to look both at responses and headers [[= product_name =]] sends to HTTP cache, and not so much at responses and headers the HTTP cache sends to the client (web browser). - It means you must be able to send requests to your origin (web server) that do not go through Varnish or Fastly. + It means you must be able to send requests to your origin (web server) that don't go through Varnish or Fastly. If you run Nginx and Varnish on premise, you should know what host and port number both Varnish and Nginx runs on. If you perform tests on Fastly enabled environment on [[= product_name_cloud =]] provided by Platform.sh, you need to use the Platform.sh dashboard to obtain the endpoint for Nginx. @@ -405,7 +405,7 @@ Typically, you can add a `gw` to the hostname and use nslookup to find it. Address: 1.2.3.4 ``` -You can also use the [Ibexa Cloud CLI](https://cli.ibexa.co/) (which has the same command as the Platform.sh CLI) to find [the endpoint](https://docs.platform.sh/domains/steps/dns.html): +You can also use the [[[= product_name_cloud =]] CLI](https://cli.ibexa.co/) (which has the same command as the Platform.sh CLI) to find [the endpoint](https://docs.platform.sh/domains/steps/dns.html): ```bash ibexa_cloud environment:info edge_hostname @@ -602,4 +602,4 @@ The `Set-Cookie` here may cause the problem. A ESI fragment should never set a c - It means that it's not recommended to always initiate a session when loading the front page. -You must ensure that you do not unintendedly start a session in a controller used by ESIs, for example, when trying to access as session variable before a session has been initiated yet. +You must ensure that you don't unintendedly start a session in a controller used by ESIs, for example, when trying to access as session variable before a session has been initiated yet. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md index 846f01ecb0..b08114a87f 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md @@ -7,23 +7,23 @@ description: Configure Fastly for use with Ibexa DXP. You can configure Fastly by using API calls or through the Fastly Web Interface. Fastly provides a [Fastly CLI](https://developer.fastly.com/reference/cli/) for configuring Fastly through its API. -Ibexa Cloud is delivered with Fastly preconfigured. +[[= product_name_cloud =]] is delivered with Fastly preconfigured. It means that you don't have to do any changes to the Fastly configuration to make your site work. -The information provided here is only applicable if you want to change the default Fastly configuration on Ibexa Cloud, -or if you're not using Ibexa Cloud and want to configure Fastly to work with [[= product_name =]] on premise. +The information provided here is only applicable if you want to change the default Fastly configuration on [[= product_name_cloud =]], +or if you're not using [[= product_name_cloud =]] and want to configure Fastly to work with [[= product_name =]] on premise. -!!! note "The Fastly Web Interface isn't available for Ibexa Cloud" - It's recommend for Ibexa Cloud customers to use the Fastly CLI instead of using the Fastly API directly with `curl`, and so on. +!!! note "The Fastly Web Interface isn't available for [[= product_name_cloud =]]" + It's recommend for [[= product_name_cloud =]] customers to use the Fastly CLI instead of using the Fastly API directly with `curl`, and so on. !!! note "Disable Varnish when you use Fastly" - Varnish is automatically provisioned on Ibexa Cloud. Varnish needs to be disabled on all environments that use + Varnish is automatically provisioned on [[= product_name_cloud =]]. Varnish needs to be disabled on all environments that use Fastly. See [documentation on how to do that](https://docs.platform.sh/guides/ibexa/fastly.html). ## Prepare for using Fastly locally -These steps aren't needed when you use Ibexa Cloud, because Fastly is preconfigured in it. +These steps aren't needed when you use [[= product_name_cloud =]], because Fastly is preconfigured in it. -### Get Fastly credentials from Ibexa Cloud installation +### Get Fastly credentials from [[= product_name_cloud =]] installation To use Fastly CLI or Fastly API directly, you need to obtain the credentials for your site. To obtain the credentials, connect to your Fastly-enabled environment (for example, production or staging) through SSH and run the following command: diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md index 964c68b7d6..e0d3df381f 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md @@ -314,7 +314,7 @@ the following happens when a page has been soft purged: - Next request hitting the cache triggers an asynchronous lookup to the back end. - If cache is still within grace period, first and subsequent requests for the content are served from cache, -and do not wait for the asynchronous lookup to finish. +and don't wait for the asynchronous lookup to finish. - The back-end lookup finishes and refreshes the cache so any subsequent requests get a fresh cache. By default, [[= product_name =]] always soft purges content on reverse proxies that support it (Varnish and Fastly), diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 0a8b7a210d..73e7a66843 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -160,7 +160,7 @@ Out of the box in `config/packages/cache_pool/cache.redis.yaml` you'll find a de !!! note "[[= product_name_cloud =]]" - For Ibexa Cloud/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Redis as `rediscache` Platform.sh service. + For [[= product_name_cloud =]]/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Redis as `rediscache` Platform.sh service. For anything else, you can enable it with environment variables. For instance, if you set the following environment variables `export CACHE_POOL="cache.redis" CACHE_DSN="secret@example.com:1234/13"`, it results in config like this: diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md index bf2c88e792..a5386e78e0 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md @@ -6,7 +6,7 @@ description: Use DDEV to run a cluster infrastructure locally. !!! caution - Do not use this procedure in production. + Don't use this procedure in production. A staging environment for validation before production should exactly replicate the production environment. This is meant for development environment only. @@ -25,7 +25,7 @@ The `ddev config --php-version` option should set the same PHP version as the pr Discover more commands in [DDEV documentation](https://ddev.readthedocs.io/en/latest/users/usage/commands/). -To run an [[= product_name_cloud =]] project locally, you may refer to [DDEV and Ibexa Cloud](ddev_and_ibexa_cloud.md) instead. +To run an [[= product_name_cloud =]] project locally, you may refer to [DDEV and [[= product_name_cloud =]]](ddev_and_ibexa_cloud.md) instead. ## Install search engine @@ -54,7 +54,7 @@ You can now check whether Elasticsearch works. For example, the `ddev exec curl -s "http://elasticsearch:9200/_count"` command checks whether the `web` server can access the `elasticsearch` server and displays the number of indexed documents. -See [ddev/ddev-elasticsearch README](https://github.com/ddev/ddev-elasticsearch) for more information on topics such as memory management. +For more information on topics such as memory management, see [ddev/ddev-elasticsearch README](https://github.com/ddev/ddev-elasticsearch). See [Elasticsearch REST API reference](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) for more request options, like, for example: diff --git a/docs/infrastructure_and_maintenance/devops.md b/docs/infrastructure_and_maintenance/devops.md index d4696e4f1e..e06d59a85b 100644 --- a/docs/infrastructure_and_maintenance/devops.md +++ b/docs/infrastructure_and_maintenance/devops.md @@ -16,7 +16,7 @@ php bin/console --env=prod cache:clear -h !!! note - If you do not specify an environment, by default `cache:clear` clears the cache for the `dev` environment. If you want to clear it for `prod` you need to use the `--env=prod` option. + If you don't specify an environment, by default `cache:clear` clears the cache for the `dev` environment. If you want to clear it for `prod` you need to use the `--env=prod` option. !!! caution "Clustering" diff --git a/docs/infrastructure_and_maintenance/security/reporting_issues.md b/docs/infrastructure_and_maintenance/security/reporting_issues.md index bb66751cbd..e20407e329 100644 --- a/docs/infrastructure_and_maintenance/security/reporting_issues.md +++ b/docs/infrastructure_and_maintenance/security/reporting_issues.md @@ -4,15 +4,16 @@ description: Learn how to report security issues in Ibexa DXP. # Reporting security issues in Ibexa products -The security of our software is a primary concern and we take it seriously. -For more information on security in our products, see [Ibexa Security Policy](https://www.ibexa.co/software-information/security). +The security of [[= product_name_base =]] software is a primary concern and we take it seriously. + +For more information on security in [[= product_name_base =]] products, see [Ibexa Security Policy](https://www.ibexa.co/software-information/security). No engineering team is perfect though, and if you do discover a security issue in one of our products we are very grateful for your help in reporting it to us privately, and refraining from public disclosure until we have found the solution and distributed it. Thank you! ## Channels -- If you're a customer or partner, please log in to your Service Portal at , click "New Ticket", and report the issue as you would report a normal support request. Ibexa Product Support responds, takes care of the report, and keeps you informed of the developments. -- If you're not a customer or partner, please log in to the Ibexa JIRA issue tracker: . Create an account if you don't have one, it's free. Click the "Create" button in the top menu to create your report. For "Project", select "Ibexa IBX", or "eZ Publish / Platform", or "eZ Platform Enterprise Edition", depending on which product is affected by the bug. **Important: Select "Security Level": "Security"!** The engineering team takes care of your report. +- If you're a customer or partner, please log in to your Service Portal at , click "New Ticket", and report the issue as you would report a normal support request. [[= product_name_base =]] Product Support responds, takes care of the report, and keeps you informed of the developments. +- If you're not a customer or partner, please log in to the [[= product_name_base =]] JIRA issue tracker: . Create an account if you don't have one, it's free. Click the "Create" button in the top menu to create your report. For "Project", select "[[= product_name_base =]] IBX", or "eZ Publish / Platform", or "eZ Platform Enterprise Edition", depending on which product is affected by the bug. **Important: Select "Security Level": "Security"!** The engineering team takes care of your report. - It's also possible to report security issues by email to - this requires no account. ## Verbosity diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index 443fc5a0f5..6b9f0eb604 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -19,8 +19,8 @@ make sure that your setup is secure. `APP_SECRET` needs to be a strong, random, securely stored value. -- Do not use a default value like `ff6dc61a329dc96652bb092ec58981f7` or `ThisTokenIsNotSoSecretChangeIt`. -- The secret must be secured against unwanted access. Do not commit the value to a version control system. +- Don't use a default value like `ff6dc61a329dc96652bb092ec58981f7` or `ThisTokenIsNotSoSecretChangeIt`. +- The secret must be secured against unwanted access. Don't commit the value to a version control system. - The secret must be long enough. 32 characters is minimum, longer is better. !!! tip @@ -36,15 +36,10 @@ make sure that your setup is secure. ### Symfony production mode Only expose Symfony production mode openly on the internet. -Do not expose the dev mode on the internet, otherwise you may disclose things like `phpinfo` and environment variables. +Don't expose the dev mode on the internet, otherwise you may disclose things like `phpinfo` and environment variables. Exposing the dev mode exposes things like `phpinfo`, environment variables and so on. -!!! tip "More information about Symfony security" - - For more information about securing Symfony-based systems, see: - - - [Authentication and authorisation]([[= symfony_doc =]]/security.html), and [more on this subject]([[= symfony_doc =]]/security.html#learn-more) - - Symfony's [secrets management system]([[= symfony_doc =]]/configuration/secrets.html) +For more information about securing Symfony-based systems, see [Authentication and authorisation]([[= symfony_doc =]]/security.html), [more on this subject]([[= symfony_doc =]]/security.html#learn-more), and Symfony's [secrets management system]([[= symfony_doc =]]/configuration/secrets.html). ## PHP @@ -52,7 +47,7 @@ Exposing the dev mode exposes things like `phpinfo`, environment variables and s PHP 7.4 introduced the `zend.exception_ignore_args` setting in `php.ini`. The default value is 0 (disabled) for backwards compatibility. -On production sites this should be set to 1 (enabled), to ensure stack traces do not include arguments passed to functions. +On production sites this should be set to 1 (enabled), to ensure stack traces don't include arguments passed to functions. Such arguments could include passwords or other sensitive information. You should also make sure no stack trace is ever visible to end users of production sites, though visible arguments are unsafe even if the stack traces only show up in log files. @@ -94,7 +89,7 @@ This is specially important for admin accounts and other privileged users. - Never go online with admin password set to `publish` or any other default value. - Introduce password quality checks. Make sure the checks are strict enough (length/complexity). -- 16 characters is a quite secure minimum length. Do not go below 10. +- 16 characters is a quite secure minimum length. Don't go below 10. - If using [[= product_name =]] v4.5 or newer, enable the password rule that rejects any password which has been exposed in a public breach. !!! tip "Password rules" @@ -173,7 +168,7 @@ Use the following checklist to ensure the roles and policies are secure: - Is there a clear role separation between the organisation's internal and external users? - Is access to user data properly restricted, in accordance with GDPR? -### Do not use "hide" for read access restriction +### Don't use "hide" for read access restriction The [visibility switcher](https://doc.ibexa.co/en/latest/content_management/locations/#location-visibility) is a convenient feature for withdrawing content from the frontend. It acts as a filter in the frontend by default. You can choose to respect it or ignore it in your code. @@ -191,7 +186,7 @@ Security should be a multi-layered exercise. It's wise to minimize what features - If possible, make the back office unavailable on the open internet. - [Symfony FOSJsRoutingBundle](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) is required in those releases where it's included, to expose routes to JavaScript. It exposes only the required routes, nothing more. It's only required in the back office SiteAccess though, so you can consider blocking it in other SiteAccesses. You should also go through your own custom routes, and decide for each if you need to expose them or not. See the documentation on [YAML route definitions for exposure](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/blob/master/Resources/doc/usage.rst#generating-uris). -- By default, a [Powered-By header](https://doc.ibexa.co/en/latest/update_and_migration/from_1.x_2.x/update_db_to_2.5/#powered-by-header) is set. It specifies what version of the DXP is running. For example, `x-powered-by: Ibexa Experience v4`. This doesn't expose anything that couldn't be detected through other means. But if you wish to obscure this, you can either omit the version number, or disable the header entirely. +- By default, a [Powered-By header](https://doc.ibexa.co/en/latest/update_and_migration/from_1.x_2.x/update_db_to_2.5/#powered-by-header) is set. It specifies what version of the DXP is running. For example, `x-powered-by: [[= product_name_exp =]] v4`. This doesn't expose anything that couldn't be detected through other means. But if you wish to obscure this, you can either omit the version number, or disable the header entirely. - Consider whether certain interfaces must be left available on the open internet. For example: - The `/search` and `/graphql` endpoints - The REST API endpoints diff --git a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md index 687e929b05..e1f3bce162 100644 --- a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md +++ b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md @@ -35,7 +35,7 @@ The language of the back office is based on the browser language. To change it you should install the proper package for your language (see [language packages list](https://github.com/ezplatform-i18n)). Once you have language packages installed, you can switch the language of the back office in the User Settings menu. -If you do not have a language defined in the browser, it's selected based on the `parameters.locale_fallback` parameter located in `config/packages/ibexa.yaml`. +If you don't have a language defined in the browser, it's selected based on the `parameters.locale_fallback` parameter located in `config/packages/ibexa.yaml`. To read more about language managing in [[= product_name =]], see the following doc pages: diff --git a/docs/multisite/languages/back_office_translations.md b/docs/multisite/languages/back_office_translations.md index 7a829e1819..438988bed3 100644 --- a/docs/multisite/languages/back_office_translations.md +++ b/docs/multisite/languages/back_office_translations.md @@ -42,7 +42,7 @@ Once you have language packages enabled, you can switch the language of the back in the User Settings menu. Otherwise, the language is selected based on the browser language. -If you do not have a language defined in the browser, the language is selected +If you don't have a language defined in the browser, the language is selected based on `parameters.locale_fallback` in `config/packages/ibexa.yaml`. ## Custom string translations diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index 8a43b2ad67..1377b1d753 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -40,7 +40,9 @@ For example, let's say that you need to store information about marathon contest ### Access control -You can control whether a user or user group is able to translate content or not. You do this by adding a [Language limitation](limitation_reference.md#language-limitation) to policies that allow creating or editing content. This limitation enables you to define which role can work with which languages in the system. (For more information of the permissions system, see [Permissions](permissions.md).) +You can control whether a user or user group is able to translate content or not. You do this by adding a [Language limitation](limitation_reference.md#language-limitation) to policies that allow creating or editing content. This limitation enables you to define which role can work with which languages in the system. + +For more information of the permissions system, see [Permissions](permissions.md). In addition, you can also control the access to the global translation list by using the Content/Translations policy. This policy allows users to add and remove languages from the global translation list. @@ -178,6 +180,6 @@ If the `translation_siteaccesses` setting isn't provided, implicit *related S When setting up SiteAccesses with different language versions, you can specify a list of preset languages for each SiteAccess. When this SiteAccess is used, the system goes through this list. If a content item is unavailable in the first (prioritized) language, it attempts to use the next language in the list, and so on. Thanks to this you can have a fallback in case of a lacking translation. -You can also assign a Default content availability flag to content types (available in the **Admin** panel). When this flag is assigned, content items of this type are available even when they do not have a language version in any of the languages configured for the current SiteAccess. +You can also assign a Default content availability flag to content types (available in the **Admin** panel). When this flag is assigned, content items of this type are available even when they don't have a language version in any of the languages configured for the current SiteAccess. If a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. diff --git a/docs/multisite/multisite_configuration.md b/docs/multisite/multisite_configuration.md index 1d64126d26..24c16f7359 100644 --- a/docs/multisite/multisite_configuration.md +++ b/docs/multisite/multisite_configuration.md @@ -39,7 +39,7 @@ A SiteAccess can be part of several groups. SiteAccess configuration has always #### `admin` SiteAccess The predefined `admin` SiteAccess in `admin_group` (configured in `config/packages/ibexa_admin_ui.yaml`) serves the back office. -Do not remove this group. +Don't remove this group. If you need a multisite setup with multiple back offices, add any additional administration SiteAccesses to `admin_group`. In cases where the sites are on separate databases, each needs its own [repository](repository_configuration.md) @@ -64,7 +64,8 @@ ibexa: ### SiteAccess matching The `match` setting defines the rule or set of rules by which SiteAccesses are matched. -See [SiteAccess matching](siteaccess_matching.md) for more information. + +For more information, see [SiteAccess matching](siteaccess_matching.md). ``` yaml ibexa: @@ -171,7 +172,7 @@ ibexa: #### SiteAccess switching in Page Builder -If you need to change between SiteAccesses in Site mode, do not use any functions in the page itself (for example, a language switcher). +If you need to change between SiteAccesses in Site mode, don't use any functions in the page itself (for example, a language switcher). This may cause unexpected errors. Instead, switch between SiteAccesses using the SiteAccess bar above the page. ## Location tree diff --git a/docs/multisite/site_factory/site_factory.md b/docs/multisite/site_factory/site_factory.md index 52a034bd5e..470b586786 100644 --- a/docs/multisite/site_factory/site_factory.md +++ b/docs/multisite/site_factory/site_factory.md @@ -168,7 +168,7 @@ ibexa: sites_location_id: 42 ``` -Now, all new directories are created under "Ibexa DXP". +Now, all new directories are created under "[[= product_name =]]". ### Provide access @@ -184,7 +184,7 @@ Set the below policies to allow users to: For full documentation on how permissions work and how to set them up, see [the permissions section](permissions.md). -To learn how to use Site Factory, see [User documentation]([[= user_doc =]]/site_organization/site_factory/). +To learn how to use Site Factory, see [User Documentation]([[= user_doc =]]/site_organization/site_factory/). ## Disable Site Factory diff --git a/docs/multisite/site_factory/site_factory_configuration.md b/docs/multisite/site_factory/site_factory_configuration.md index d78a48ee13..0dadf77586 100644 --- a/docs/multisite/site_factory/site_factory_configuration.md +++ b/docs/multisite/site_factory/site_factory_configuration.md @@ -89,7 +89,7 @@ ibexa_site_factory: ``` Manage the permissions associated to the user group skeleton by [assigning roles](https://doc.ibexa.co/projects/userguide/en/latest/site_organization/organizing_the_site/#managing-permissions). -Make sure that the roles that you assign to the user group skeleton do not contain Location-based limitations. +Make sure that the roles that you assign to the user group skeleton don't contain Location-based limitations. User group skeletons cannot contain individual user content items either. User group skeletons are retained after deleting the site. @@ -110,4 +110,4 @@ ibexa_site_factory: update_roles: [Anonymous, Administrator] ``` -For more information about roles and policies, see [Permissions](permissions.md). +For more information about roles and policies, see [Permissions](permissions.md). diff --git a/docs/multisite/siteaccess/siteaccess_aware_configuration.md b/docs/multisite/siteaccess/siteaccess_aware_configuration.md index d61993c81d..533dd875fb 100644 --- a/docs/multisite/siteaccess/siteaccess_aware_configuration.md +++ b/docs/multisite/siteaccess/siteaccess_aware_configuration.md @@ -170,7 +170,7 @@ parameters: #### Merging hash values between scopes -When you define a hash as semantic config, you sometimes do not want the SiteAccess settings to replace the default or group values, +When you define a hash as semantic config, you sometimes don't want the SiteAccess settings to replace the default or group values, but enrich them by appending new entries. This is possible by using `$processor->mapConfigArray()`, which you must call outside the closure (before or after), so that it's called only once. @@ -259,7 +259,7 @@ that ensures the array setting has unique values. It only works on normal arrays Instead of passing a callable to `$processor->mapConfig()`, you can pass an instance of `Ibexa\Bundle\Core\DependencyInjection\Configuration\SiteAccessAware\ConfigurationMapperInterface`. -This can be useful if you have a lot of configuration to map and do not want to pollute +This can be useful if you have a lot of configuration to map and don't want to pollute your service container extension class (it's better for maintenance). #### Merging hash values between scopes diff --git a/docs/multisite/siteaccess/siteaccess_matching.md b/docs/multisite/siteaccess/siteaccess_matching.md index bd324a2f83..cee515cb6b 100644 --- a/docs/multisite/siteaccess/siteaccess_matching.md +++ b/docs/multisite/siteaccess/siteaccess_matching.md @@ -294,7 +294,7 @@ You can define this environment variable directly in web server configuration: !!! tip You can configure the variable by using the PHP-FPM configuration file. - See [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.configuration.php#example-25) for more information. + For more information, see [PHP-FPM documentation](https://www.php.net/manual/en/install.fpm.configuration.php#example-25). !!! note "Precedence" diff --git a/docs/permissions/limitation_reference.md b/docs/permissions/limitation_reference.md index 3e690e3521..36aec10ae9 100644 --- a/docs/permissions/limitation_reference.md +++ b/docs/permissions/limitation_reference.md @@ -334,13 +334,11 @@ This limitation can be used as a role limitation. ### Usage notes -For more information on how to restrict user's access to part of the Subtree -follow [the example in the Admin management section](permission_use_cases.md#restrict-editing-to-part-of-the-tree). +For more information on how to restrict user's access to part of the Subtree, see [the example in the Admin management section](permission_use_cases.md#restrict-editing-to-part-of-the-tree). ## Version Lock limitation -The Version Lock (`VersionLock`) limitation specifies whether the user can perform actions, for example, edit -or unlock, on content items that are in a workflow. +The Version Lock (`VersionLock`) limitation specifies whether the user can perform actions, for example, edit or unlock, on content items that are in a workflow. This limitation can be used as a role limitation. diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index 363c92df5d..44f1072da4 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -60,7 +60,7 @@ Further manipulation of Trash requires the `content/restore` policy to restore i !!! caution - With the `content/cleantrash` policy, the User can empty the Trash even if they do not have access to the trashed content, + With the `content/cleantrash` policy, the User can empty the Trash even if they don't have access to the trashed content, for example, because it belonged to a Section that the User does not have permissions for. ## Restrict editing to part of the tree diff --git a/docs/personalization/api_reference/content_api.md b/docs/personalization/api_reference/content_api.md index 096116eac5..5e61f89e60 100644 --- a/docs/personalization/api_reference/content_api.md +++ b/docs/personalization/api_reference/content_api.md @@ -139,7 +139,7 @@ To check how many digits the fractional unit of a currency has, see the [ISO 421 Items with defined validity are recommended only in the specified timeframe. Values in the `validto` and `validfrom` attributes must follow the [XSD format](https://www.w3.org/TR/xmlschema-2/#dateTime) -and do not include the time zone. +and don't include the time zone. Time zone is always your time zone. ##### Category path diff --git a/docs/personalization/api_reference/recommendation_api.md b/docs/personalization/api_reference/recommendation_api.md index f470aec773..809cfc1c61 100644 --- a/docs/personalization/api_reference/recommendation_api.md +++ b/docs/personalization/api_reference/recommendation_api.md @@ -9,8 +9,7 @@ that rely on the HTTP GET method. The result can a list of item IDs that can then be used to call the underlying CMS or shop system and postload the necessary information for the rendering process. -For more information about Personalization, see [Introduction](personalization.md), -[Basic integration](recommendation_integration.md). +For more information about Personalization, see [Introduction](personalization.md) and [Basic integration](recommendation_integration.md). !!! note "Authentication" @@ -69,9 +68,8 @@ You can use the following parameters to customize a request: ##### Submodel parameters -If your recommendation model uses submodels to group content items/products based -on an attribute, you can pass the following parameters to request recommendations -for a specific group. +If your recommendation model uses submodels to group content items/products based on an attribute, you can pass the following parameters to request recommendations for a specific group. + For more information, see [Submodels]([[= user_doc =]]/personalization/recommendation_models/#submodels). |Parameter|Example|Description|Value| @@ -105,6 +103,7 @@ items and an array of recommendation objects in JSON or JSONP format. The result can be integrated into any webpage on the client side by using script code. To track user actions like "clickrecommended" and "rendered", use the links delivered in the response. + For more information, see inline comments below. !!! note "Previewing recommendations" @@ -113,8 +112,7 @@ For more information, see inline comments below. and how they're rendered in the user interface. For more information, see [Previewing scenario results]([[= user_doc =]]/personalization/previewing_scenario). -For more information about integrating recommendations in the web page, -see [Best practices](recommendation_integration.md). +For more information about integrating recommendations in the web page, see [Best practices](recommendation_integration.md). ### Response object format diff --git a/docs/personalization/api_reference/tracking_api.md b/docs/personalization/api_reference/tracking_api.md index 5d2b86cc52..a97612ebb5 100644 --- a/docs/personalization/api_reference/tracking_api.md +++ b/docs/personalization/api_reference/tracking_api.md @@ -14,16 +14,18 @@ The most popular user events are: - Login - When a user logs in on a website - Clickrecommended - When a user clicks a recommendation -For a complete list of events, see [Event types]([[= user_doc =]]/personalization/event_types) in the user documentation.  +For a complete list of events, see [Event types]([[= user_doc =]]/personalization/event_types) in User Documentation.  Depending on the event type, some additional parameters, such as item price or user rating, must be provided. Importing historical user data can help you reduce the delay in delivery of high quality recommendations. + For more information, see [Importing historical user tracking data](importing_historical_user_tracking_data.md). Apart from the tracking API, you can add tracking to the website by integrating a JavaScript library. + For more information, see [Tracking with ibexa-tracker.js](tracking_with_ibexa-tracker.md). ## Definitions @@ -127,7 +129,7 @@ In the case of bestsellers, this could lead to the appearance of a shirt in size L on position 2 and the same shirt in size M on position 4. Customer B decides to use the UPC as item identifiers. -This results in recommendations that do not contain variations of the currently shown item. +This results in recommendations that don't contain variations of the currently shown item. Therefore, the detail page of shirt X does not contain a recommendation for the same shirt in a different size. And the same shirt does not show up twice on a list of bestseller recommendations. @@ -174,8 +176,7 @@ Multiple category locations of an item (multi-homing) are therefore possible. Events are forwarded to the Personalization server with HTTP or HTTPS requests (or [RESTful-Requests](https://en.wikipedia.org/wiki/Representational_state_transfer)). Both GET and POST methods are allowed for the event tracking. - Make sure that all embedded and query string parameters are URL encoded and - do not use a backslash, encoded as %5C\. + Make sure that all embedded and query string parameters are URL encoded and don't use a backslash, encoded as %5C\. ### Event parameters @@ -211,7 +212,7 @@ This event has no query string parameters. ### Blacklist event -If a website offers a link or button that allows feedback similar to "do not +If a website offers a link or button that allows feedback similar to "don't recommend this product to me anymore", a user could express that they have bought it already in another shop. @@ -257,6 +258,7 @@ The price must be a price the user paid for the item, including all taxes and di If product price filtering is activated, the information provided over the product import is used. + For more information, see [Content API](content_api.md). The currency is stored with the price and normalized only when statistic information @@ -290,7 +292,7 @@ Some optional request parameters can be set over query string parameters (GET pa |Name|Description|Values| |---|---|---| -|`categorypath`|The forward slash-separated path of categories of the item. Like all other parameters it must be URL-encoded, for example `%2FCameras%26Foto%2FCompact%20Cameras%2FCanon`.
For use cases, see [Category path filters]([[= user_doc =]]/personalization/filters/#category-path-filters) in the user documentation.|URL-encoded string.
Initial and trailing slashes are ignored: "/Cameras/" is the same as "Cameras".| +|`categorypath`|The forward slash-separated path of categories of the item. Like all other parameters it must be URL-encoded, for example `%2FCameras%26Foto%2FCompact%20Cameras%2FCanon`.
For use cases, see [Category path filters]([[= user_doc =]]/personalization/filters/#category-path-filters) in User Documentation.|URL-encoded string.
Initial and trailing slashes are ignored: "/Cameras/" is the same as "Cameras".| ### Consume event diff --git a/docs/personalization/api_reference/user_api.md b/docs/personalization/api_reference/user_api.md index d7fed95279..991d46ec42 100644 --- a/docs/personalization/api_reference/user_api.md +++ b/docs/personalization/api_reference/user_api.md @@ -111,6 +111,6 @@ The following attribute types are supported: - DATE - An XSD-formatted date, for example, "2014-08-07" - DATETIME - An XSD-formatted time without a time zone, for example, "2014-08-07T14:43:12" -- NOMINAL - A value from a fixed length list, for example "gender" or "favorite film genre". If you do not set the attribute type, this is the default value +- NOMINAL - A value from a fixed length list, for example "gender" or "favorite film genre". If you don't set the attribute type, this is the default value - NUMERIC - A decimal value, for example, "1.23" or "-2345" - TEXT - A longer text, usually free form diff --git a/docs/personalization/enable_personalization.md b/docs/personalization/enable_personalization.md index ea160bb3ad..30f948115f 100644 --- a/docs/personalization/enable_personalization.md +++ b/docs/personalization/enable_personalization.md @@ -52,8 +52,7 @@ the Personalization server. Its job is to track the way visitors use the website and recommend content based on their behavior. -For more information about integrating the Personalization service, -see [Developer guide](tracking_api.md) and [Best practices](tracking_integration.md). +For more information about integrating the Personalization service, see [Developer guide](tracking_api.md) and [Best practices](tracking_integration.md). ### Set up item type tracking @@ -117,7 +116,7 @@ ibexa: For data exchange purposes, basic authentication is enabled by default. To change this, contact support@ibexa.co. For security reasons, [store the authentication credentials in the ENV file](#set-up-customer-credentials), - and do not commit them to the Version Control System. + and don't commit them to the Version Control System. Then, use environment variables to pull them into the YAML file. | Parameter | Description | diff --git a/docs/personalization/integrate_recommendation_service.md b/docs/personalization/integrate_recommendation_service.md index 372017f63d..4b9613ffcb 100644 --- a/docs/personalization/integrate_recommendation_service.md +++ b/docs/personalization/integrate_recommendation_service.md @@ -218,6 +218,6 @@ You can configure integration at a more advanced level to track more events, use additional parameters, apply custom scenario configurations, filters, and enable additional features. -For more information about available functionalities, see the [User Documentation]([[= user_doc =]]/personalization/personalization). +For more information about available functionalities, see [User Documentation]([[= user_doc =]]/personalization/personalization). For more information about integrating the Personalization service, see [tracking API](tracking_api.md) and [tracking integration](tracking_integration.md) documentation. diff --git a/docs/personalization/legacy_recommendation_api.md b/docs/personalization/legacy_recommendation_api.md index 90f8eed750..7e7debe2a1 100644 --- a/docs/personalization/legacy_recommendation_api.md +++ b/docs/personalization/legacy_recommendation_api.md @@ -36,7 +36,7 @@ The result is a list of item IDs that can be used to call the underlying CMS or shop system, to retrieve the necessary information for the rendering process. To allow the customer to retrieve different types of recommendations based on different methods (for example, Collaborative Filtering, Content Based, Stereotype, etc.) the Recommendation System uses scenario IDs relating to a predefined set of configurations inside the system. -These configurations are a combination of methods and filters that should be applied including possible fallbacks if the requested methods do not deliver a result. +These configurations are a combination of methods and filters that should be applied including possible fallbacks if the requested methods don't deliver a result. A recommendation request looks like this: @@ -47,7 +47,7 @@ The embedded parameters `solutionid`, `clientid` and `userid` are the same as us | Parameter Name | Description | Values | |-----|-----|------| | `scenarioid` | The ID of the scenario used for providing recommendations. It's configured or predefined in the Administration GUI. | alphanumeric | -| `extension` | The format the server generates the response in. There are three formats supported: JSON, XML and JSONP. See the chapter [Response Handling](#response-handling) below for more information | json, xml or jsonp | +| `extension` | The format the server generates the response in. There are three formats supported: JSON, XML and JSONP. For more information, see [Response Handling](#response-handling). | json, xml or jsonp | ## Basic Request Parameters @@ -221,7 +221,7 @@ The last modification timestamp indicates a change that could influence the reco | Also consumed read articles in the last hour | current article | 30 minutes | Models with a short scope are usually built several times a day or even per hour. In this case the expiration time is set to the half of the model build frequency/period. | | Personalized recommendation based on the user's statistic | customers click history | now | Although the statistic model isn't updated within minutes, it's very likely that the context is changed shortly (customer clicks another product and therefore the click is added to his history). The expiration time should not be much longer than the user activity on the web page. | -In most cases you do not need to calculate the expiration time manually. The table above is provided for the orientation, how the Expires header of the HTTP response is calculated by the recommendation engine and already provided to your caching system. You just need to make sure that the Expires header is used in the configuration of your caching system instead of a static value out of your configuration. +In most cases you don't need to calculate the expiration time manually. The table above is provided for the orientation, how the Expires header of the HTTP response is calculated by the recommendation engine and already provided to your caching system. You just need to make sure that the Expires header is used in the configuration of your caching system instead of a static value out of your configuration. ## Integration best Practices diff --git a/docs/personalization/personalization_guide.md b/docs/personalization/personalization_guide.md index 30fed7bf76..5ac6746336 100644 --- a/docs/personalization/personalization_guide.md +++ b/docs/personalization/personalization_guide.md @@ -76,7 +76,7 @@ Use segments to get content targeted at particular user groups. Segments calcula Personalization includes interface as API that you can use to interact with stored data and to send requests and export data from the service. -For more information see documentation for API operations available for Personalization: +For more information, see documentation for API operations available for Personalization: - [Tracking API](api_reference/tracking_api.md/) - [Content API](api_reference/content_api.md/) diff --git a/docs/pim/pim_guide.md b/docs/pim/pim_guide.md index 53c5b574e6..2c952882a8 100644 --- a/docs/pim/pim_guide.md +++ b/docs/pim/pim_guide.md @@ -181,7 +181,7 @@ Catalogs can be created just like with the local PIM, but the criteria are limit #### Limitations -The default implementation, which serves as a basis for the example remote PIM package, has some limitations: certain functionalities either do not operate or operate within defined constraints. +The default implementation, which serves as a basis for the example remote PIM package, has some limitations: certain functionalities either don't operate or operate within defined constraints. Therefore, if your specific requirements aren't met, you may need to extend [[= product_name =]]. ##### Editing product types, products and product attributes @@ -203,7 +203,7 @@ Therefore, if your specific requirements aren't met, you must extend the applica ##### Simplified presentation of PIM-related blocks and views Enabling Remote PIM impacts a number of application views and blocks, such as Product view, Product list, Catalog and Product Collection. -they're simplified, for example, they do not include thumbnails and other assets, or refer to URL aliases. +they're simplified, for example, they don't include thumbnails and other assets, or refer to URL aliases. You can customize them by extending the default implementation. ##### Limited HTTP Caching @@ -220,7 +220,7 @@ For this, the following configuration is required: - at least one price added for the product, - availability of the product set with positive or infinitive stock. -Next, follow steps from [product management in user documentation]([[= user_doc =]]/persona_paths/manage_products/). +Next, follow steps from [product management in User Documentation]([[= user_doc =]]/persona_paths/manage_products/). ## Benefits diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index b20bdef658..c1150b2962 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -42,7 +42,8 @@ It enables you to manually select a set of content items to be displayed. To enable adding content to a Collection block in a clean installation, you need to configure the views for the block and define which content types can be embedded in it. - See [block templates](https://doc.ibexa.co/en/latest/content_management/pages/page_blocks/#block-templates) for more information and an example. + + For more information and an example, see [block templates](https://doc.ibexa.co/en/latest/content_management/pages/page_blocks/#block-templates). #### RecommendationBundle adapted for YooChoose v2 diff --git a/docs/release_notes/ez_platform_v1.12.0.md b/docs/release_notes/ez_platform_v1.12.0.md index 3c1bb24d1c..1b014c2be0 100644 --- a/docs/release_notes/ez_platform_v1.12.0.md +++ b/docs/release_notes/ez_platform_v1.12.0.md @@ -16,19 +16,20 @@ You also have new options to format your text using subscript, superscript, quot ![New text formatting options](oe-formatting-new-options.png) -See [EZP-28030](https://issues.ibexa.co/browse/EZP-28030) for more information. +For more information, see [EZP-28030](https://issues.ibexa.co/browse/EZP-28030). #### Improved full text search capabilities -See [EZP-26806](https://issues.ibexa.co/browse/EZP-26806) for more information. +For more information, see [EZP-26806](https://issues.ibexa.co/browse/EZP-26806). #### Deleting translations You can now remove translations from content item Versions through the PHP API. -See the section on [deleting translations](https://doc.ibexa.co/en/latest/api/public_php_api_creating_content/#deleting-a-translation) for more information. +For more information, see the section on [deleting translations](https://doc.ibexa.co/en/latest/api/public_php_api_creating_content/#deleting-a-translation). -You also have a new endpoint available for deleting a single Version, see [EZP-27864](https://issues.ibexa.co/browse/EZP-27864) for more information. +You also have a new endpoint available for deleting a single Version. +For more information, see [EZP-27864](https://issues.ibexa.co/browse/EZP-27864). #### Improved Security for password storage @@ -100,4 +101,4 @@ To update to this version, follow the [updating guide](https://doc.ibexa.co/en/ This release changes the way of loading React to avoid a case where it was loaded twice and caused errors. Take this into consideration if you user React in your own implementation. - See [this PR](https://github.com/ezsystems/PlatformUIBundle/pull/906) for more information. + For more information, see [this PR](https://github.com/ezsystems/PlatformUIBundle/pull/906). diff --git a/docs/release_notes/ez_platform_v2.1.0.md b/docs/release_notes/ez_platform_v2.1.0.md index 29315c96ca..1f695598e0 100644 --- a/docs/release_notes/ez_platform_v2.1.0.md +++ b/docs/release_notes/ez_platform_v2.1.0.md @@ -16,7 +16,7 @@ You can now add custom tags to RichText fields. Custom tags enable you to extend the menu of available elements when editing a RichText field with the Online Editor. -See [Custom tags](https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-tags) for more information. +For more information, see [Custom tags](https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-tags). ### Object states diff --git a/docs/release_notes/ez_platform_v2.2.0.md b/docs/release_notes/ez_platform_v2.2.0.md index b37e23459a..819ef97ba7 100644 --- a/docs/release_notes/ez_platform_v2.2.0.md +++ b/docs/release_notes/ez_platform_v2.2.0.md @@ -60,7 +60,7 @@ You can find the list of all bookmarks in *Browse content* section. There, you c ### Standard design eZ Platform now comes with two designs using the [design engine](https://doc.ibexa.co/en/2.5/guide/design_engine): `standard` for content view and `admin` for the back office. -See [default designs](https://doc.ibexa.co/en/2.5/guide/design_engine/#default-designs) for more information. +For more information, see [default designs](https://doc.ibexa.co/en/2.5/guide/design_engine/#default-designs). !!! caution @@ -87,7 +87,7 @@ Database charset is changed from UTF8 to UTF8MB4, to support 4-byte characters. You can now select the pattern that is used to generate URL patterns. -See [URL alias patterns](https://doc.ibexa.co/en/2.5/guide/url_management/#url-alias-patterns) for more information about the available settings. +For more information about the available settings, see [URL alias patterns](https://doc.ibexa.co/en/2.5/guide/url_management/#url-alias-patterns). !!! caution "Default URL generation pattern" diff --git a/docs/release_notes/ez_platform_v2.3.md b/docs/release_notes/ez_platform_v2.3.md index f5adf40815..342bd016c7 100644 --- a/docs/release_notes/ez_platform_v2.3.md +++ b/docs/release_notes/ez_platform_v2.3.md @@ -33,7 +33,7 @@ The timeline also shows other events, such a Content published using the date-based publisher. -For more information, check [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options) in User Documentation. +For more information, see [advanced publishing options](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/advanced_publishing_options) in User Documentation. ### Form Builder @@ -49,13 +49,13 @@ For more information, check [advanced publishing options](https://doc.ibexa.co/p See [Extending Form Builder](https://doc.ibexa.co/en/2.5/guide/extending/extending_form_builder) for information on how to modify and create Form fields. -Fore more information, check [forms](https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms) in User Documentation. +For more information, see [forms](https://doc.ibexa.co/projects/userguide/en/2.5/creating_content_advanced/#forms) in User Documentation. ### ImageAsset field type You can now create a single source media library with images that can be reused across the system. -See [Reusing images](https://doc.ibexa.co/en/2.5/guide/images/#reusing-images) and [ImageAsset field type reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/imageassetfield) for more information. +For more information, see [Reusing images](https://doc.ibexa.co/en/2.5/guide/images/#reusing-images) and [ImageAsset field type reference](https://doc.ibexa.co/en/2.5/api/field_types_reference/imageassetfield). ![Set up multiple relations with image](2.3_image_asset.png) @@ -64,7 +64,7 @@ See [Reusing images](https://doc.ibexa.co/en/2.5/guide/images/#reusing-images) a A new `ezplatform:urls:regenerate-aliases` command enables you to regenerate all URL aliases. You can use it after changing URL alias configuration, or in case of database corruption. -See [Regenerating URL aliases](https://doc.ibexa.co/en/2.5/guide/url_management/#regenerating-url-aliases) for more information. +For more information, see [Regenerating URL aliases](https://doc.ibexa.co/en/2.5/guide/url_management/#regenerating-url-aliases). ### User preferences @@ -100,7 +100,7 @@ There are three new ways you can now contribute to back office translations: - translate in-context with console - translate directly on the Crowdin website -See [How to translate the interface using Crowdin](https://doc.ibexa.co/en/2.5/community_resources/translations/#how-to-translate-the-interface-using-crowdin) for more information. +For more information, see [How to translate the interface using Crowdin](https://doc.ibexa.co/en/2.5/community_resources/translations/#how-to-translate-the-interface-using-crowdin). ## Full list of new features, improvements and bug fixes since v2.2.0 diff --git a/docs/release_notes/ez_platform_v2.4.md b/docs/release_notes/ez_platform_v2.4.md index 3145d45ee4..9d05a8a449 100644 --- a/docs/release_notes/ez_platform_v2.4.md +++ b/docs/release_notes/ez_platform_v2.4.md @@ -88,7 +88,7 @@ When you translate Content of this type, the content type information is display New multi-file content management functionalities enable you to move and delete multiple files at the same time. -See [Multi-file content management](https://doc.ibexa.co/projects/userguide/en/2.5/multi_file_content_management/#multi-file-content-management) for more information. +For more information, see[Multi-file content management](https://doc.ibexa.co/projects/userguide/en/2.5/multi_file_content_management/#multi-file-content-management). !!! dxp @@ -110,13 +110,13 @@ The list of all drafts can now be found in the **Administrator User** menu under ![Administrator User list of all Drafts](2.4_drafts_admin_user.png "Administrator User list of all Drafts") -See [Reviewing a draft](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/flex_workflow/#reviewing-a-draft) for more information. +For more information, see [Reviewing a draft](https://doc.ibexa.co/projects/userguide/en/2.5/publishing/flex_workflow/#reviewing-a-draft). ### Subtree search filter A new filter enables you to filter search results by Subtree. -See [Simplified Filtered search](https://doc.ibexa.co/projects/userguide/en/2.5/search/#simplified-filtered-search) for more information. +For more information, see [Simplified Filtered search](https://doc.ibexa.co/projects/userguide/en/2.5/search/#simplified-filtered-search). ### Sub-items limit @@ -148,7 +148,7 @@ This release introduces a few simplifications to API use for content types: - Exposes `content->getContentType()` for easier use, including from Twig as `content.contentType`. When iterating over the result set of content/Locations these are effectively loaded all at once. - Adds possibility to load several content types in bulk using `ContentTypeService->loadContentTypeList()`. -- `UserService` now exposes `isUser()` and `isUserGroup()`. They do not need to do a lookup to the database to tell if a content item is of type user or user group. +- `UserService` now exposes `isUser()` and `isUserGroup()`. They don't need to do a lookup to the database to tell if a content item is of type user or user group. #### Load multiple Locations @@ -210,7 +210,9 @@ you're now able to load multiple Locations at once, using `LocationService->load enabled: false ``` - By default `HS256` is used as signature algorithm for generated token but we strongly recommend switching to SSH keys. For more information see [`LexikJWTAuthenticationBundle` installation instruction](https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md#installation). + By default `HS256` is used as signature algorithm for generated token but we strongly recommend switching to SSH keys. + + For more information, see [`LexikJWTAuthenticationBundle` installation instruction](https://github.com/lexik/LexikJWTAuthenticationBundle/blob/master/Resources/doc/index.md#installation). 3\. Add `EzSystems\EzPlatformPageBuilder\Security\EditorialMode\TokenAuthenticator` authentication provider to `ezpublish_front` firewall before `form_login` in `app/config/security.yml`: diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 0c5491ba01..62a079bd7d 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -21,9 +21,9 @@ Each content item has a unique icon that helps you identify it without opening. ![Content tree in the menu](left_menu_tree.png "Content tree in the menu") -For more information on custom configuration, see [content tree](https://doc.ibexa.co/en/2.5/guide/config_back_office/#content-tree) in the developer documentation. +For more information on custom configuration, see [content tree](https://doc.ibexa.co/en/2.5/guide/config_back_office/#content-tree) in Developer Documentation. -For full description of the interface, see [content tree](https://doc.ibexa.co/projects/userguide/en/2.5/content_model/#content-tree) in the user documentation. +For full description of the interface, see [content tree](https://doc.ibexa.co/projects/userguide/en/2.5/content_model/#content-tree) in User Documentation. ### Webpack Encore @@ -44,7 +44,7 @@ Database schema is now created based on [YAML configuration](https://github.com/ You can now take advantage of [GraphQL](https://doc.ibexa.co/en/2.5/api/graphql) to query and operate on content. It uses a domain schema based on your content model. -See [GraphQL documentation](https://graphql.org/) for more information about GraphQL in general. +For more information, see [GraphQL documentation](https://graphql.org/). ### Matrix field type diff --git a/docs/release_notes/ez_platform_v3.0.md b/docs/release_notes/ez_platform_v3.0.md index 2429456e20..7af5ea752f 100644 --- a/docs/release_notes/ez_platform_v3.0.md +++ b/docs/release_notes/ez_platform_v3.0.md @@ -50,10 +50,9 @@ For details, see [Bundles](https://doc.ibexa.co/en/latest/guide/bundles). The new Site management User Interface is now integrated with back office. It enables you to easily create and manage multiple sites from the back office without editing the configuration files. - For more information about: + For more information about enabling and configuring, see [Enable Site Factory](https://doc.ibexa.co/en/latest/guide/multisite/site_factory/#enable-site-factory). - - enabling and configuring, see [Enable Site Factory](https://doc.ibexa.co/en/latest/guide/multisite/site_factory/#enable-site-factory) - - using the Site Factory, see [User Guide]([[= user_doc =]]/site_organization/site_factory) + For more information about using the Site Factory, see [User Documentation]([[= user_doc =]]/site_organization/site_factory) ### Scheduling @@ -183,7 +182,7 @@ They can be defined per SiteAccess, or per content view. Five built-in ready-to-use Query Types have been added: `Children`, `Siblings`, `Ancestors`, `RelatedToContent`, and `GeoLocation`. You can now use the `ez_render_content_query` and `ez_render_location_query` Twig functions -to make use of Query Types that do not use the current content or Location. +to make use of Query Types that don't use the current content or Location. ### Grouping blocks in Page Builder @@ -200,6 +199,7 @@ You can now add custom tooltips to provide more information for the users when t ### Thumbnails The new thumbnails API allows you to easily choose an image for each content. + For more information, see [Extending thumbnails](https://doc.ibexa.co/en/latest/extending/extending_thumbnails). ### Type hints for public PHP API diff --git a/docs/release_notes/ez_platform_v3.0_deprecations.md b/docs/release_notes/ez_platform_v3.0_deprecations.md index 682564dd87..a71a0f5d5d 100644 --- a/docs/release_notes/ez_platform_v3.0_deprecations.md +++ b/docs/release_notes/ez_platform_v3.0_deprecations.md @@ -467,7 +467,7 @@ Using dynamic settings (through `$setting$`) and getting settings from the [Conf or method call has been dropped. You should use the ConfigResolver instead. -Do not store the values globally. Every time the value is needed call `ConfigResolverInterface::getParameter`. +Don't store the values globally. Every time the value is needed call `ConfigResolverInterface::getParameter`. ### Controllers diff --git a/docs/release_notes/ez_platform_v3.1.md b/docs/release_notes/ez_platform_v3.1.md index 35cca92347..708e00f219 100644 --- a/docs/release_notes/ez_platform_v3.1.md +++ b/docs/release_notes/ez_platform_v3.1.md @@ -12,7 +12,7 @@ [eZ Commerce](https://github.com/ezsystems/ezcommerce) now uses Symfony 5 and is fully integrated into the eZ Platform back office. -Refer to [eZ Commerce documentation](https://doc.ezplatform.com/projects/ezcommerce/en/latest/) for more information. +For more information, see [eZ Commerce documentation](https://doc.ezplatform.com/projects/ezcommerce/en/latest/). ## New features diff --git a/docs/release_notes/ibexa_dxp_v3.2.md b/docs/release_notes/ibexa_dxp_v3.2.md index d757720ba4..640e3ec828 100644 --- a/docs/release_notes/ibexa_dxp_v3.2.md +++ b/docs/release_notes/ibexa_dxp_v3.2.md @@ -29,6 +29,7 @@ and use assets such as images directly from the DAM in your content. ### Autosave [[= product_name_base =]] Platform can now save your edits in a content item or product automatically to help you preserve the progress in an event of a failure. + For more information, see [Autosave](https://doc.ibexa.co/projects/userguide/en/latest/publishing/publishing/#autosave). ### Aggregation API @@ -39,7 +40,7 @@ to group search results and get the count of results per aggregation type. You can aggregate results by general conditions such as content type or Section, or by Field aggregations such as the value of specific Fields. -See [Aggregation API](https://doc.ibexa.co/en/latest/api/public_php_api_search/#aggregation) for more information. +For more information, see [Aggregation API](https://doc.ibexa.co/en/latest/api/public_php_api_search/#aggregation). ### Targeting block and Segmentation API [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] @@ -60,7 +61,7 @@ Use `ez_render_content(content)` and `ez_render_location(location)` to render th You can also use `ez_render()` and provide it with either a content or Location object. -See [Using `ez_render` Twig helpers](https://doc.ibexa.co/en/latest/guide/templates/#using-ez_render-twig-helpers) for more information. +For more information, see [Using `ez_render` Twig helpers](https://doc.ibexa.co/en/latest/guide/templates/#using-ez_render-twig-helpers). ### JWT authentication @@ -69,9 +70,9 @@ and [GraphQL](https://doc.ibexa.co/en/latest/api/graphql/#jwt-authentication). See [JWT authentication](https://doc.ibexa.co/en/latest/guide/security/#jwt-authentication) to learn how to configure this authentication method. -### Searching in Ibexa Commerce with Elasticsearch [[% include 'snippets/commerce_badge.md' %]] +### Searching in [[= product_name_com =]] with Elasticsearch [[% include 'snippets/commerce_badge.md' %]] -You can now use Elasticsearch for searching in Ibexa Commerce. +You can now use Elasticsearch for searching in [[= product_name_com =]]. See [Install Ibexa Platform](https://doc.ibexa.co/en/latest/getting_started/install_ez_platform/#install-and-configure-a-search-engine) to learn how to install and configure the search engine. @@ -83,7 +84,7 @@ You can now define user group skeletons where you define policies and limitation You can then associate a number of such skeletons with a site template. User group skeletons survive deleting a site. -See [Configure user group skeleton](https://doc.ibexa.co/en/latest/guide/multisite/site_factory_configuration/#user-group-skeletons) for more information. +For more information, see [Configure user group skeleton](https://doc.ibexa.co/en/latest/guide/multisite/site_factory_configuration/#user-group-skeletons). ### Calendar widget improvements @@ -96,7 +97,7 @@ For more information, see [Calendar widget](https://doc.ibexa.co/projects/usergu ### Cloning content types -When creating content types in the back office, you do not have to start from scratch. +When creating content types in the back office, you don't have to start from scratch. You can now clone an existing content type instead. To do this, click the **Copy** icon located next to the content type that you want to clone. @@ -109,6 +110,6 @@ to [get Object states and Object state groups](https://doc.ibexa.co/en/latest/ap ## Full changelog -| Ibexa Platform | Ibexa DXP | Ibexa Commerce | +| Ibexa Platform | [[= product_name =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Platform v3.2.0](https://github.com/ezsystems/ezplatform/releases/tag/v3.2.0) | [Ibexa DXP v3.2.0](https://github.com/ezsystems/ezplatform-ee/releases/tag/v3.2.0) | [Ibexa Commerce v3.2.0](https://github.com/ezsystems/ezcommerce/releases/tag/v3.2.0) +| [Ibexa Platform v3.2.0](https://github.com/ezsystems/ezplatform/releases/tag/v3.2.0) | [[[= product_name =]] v3.2.0](https://github.com/ezsystems/ezplatform-ee/releases/tag/v3.2.0) | [[[= product_name_com =]] v3.2.0](https://github.com/ezsystems/ezcommerce/releases/tag/v3.2.0) diff --git a/docs/release_notes/ibexa_dxp_v3.3.md b/docs/release_notes/ibexa_dxp_v3.3.md index b16bb78bfc..b18f723d5d 100644 --- a/docs/release_notes/ibexa_dxp_v3.3.md +++ b/docs/release_notes/ibexa_dxp_v3.3.md @@ -34,6 +34,7 @@ The Image Editor is available when browsing the Media library, or creating or ed that contain an `ezimage` or `ezimageasset` Field. You can modify the Image Editor's default settings to change its appearance or behavior. + For more information, see [Configuring the Image Editor](https://doc.ibexa.co/en/3.3/guide/image_editor). ### Migration bundle @@ -82,13 +83,14 @@ framework: See [list of changes in Symfony 5.2](https://symfony.com/blog/symfony-5-2-curated-new-features). -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Content v3.3.0](https://github.com/ibexa/content/releases/tag/v3.3.0) | [Ibexa Experience v3.3.0](https://github.com/ibexa/experience/releases/tag/v3.3.0) | [Ibexa Commerce v3.3.0](https://github.com/ibexa/commerce/releases/tag/v3.3.0)| +| [[[= product_name_content =]] v3.3.0](https://github.com/ibexa/content/releases/tag/v3.3.0) | [[[= product_name_exp =]] v3.3.0](https://github.com/ibexa/experience/releases/tag/v3.3.0) | [[[= product_name_com =]] v3.3.0](https://github.com/ibexa/commerce/releases/tag/v3.3.0)| ## v3.3.15 ### Symfony 5.4 The version v3.3.15 moves [[= product_name =]] to Symfony 5.4. + For more information, see [Symfony 5.4 documentation](https://symfony.com/releases/5.4) and [update documentation](update_from_3.3.md#3315). diff --git a/docs/release_notes/ibexa_dxp_v4.0.md b/docs/release_notes/ibexa_dxp_v4.0.md index 9c7ae07b89..a29dc6bcfa 100644 --- a/docs/release_notes/ibexa_dxp_v4.0.md +++ b/docs/release_notes/ibexa_dxp_v4.0.md @@ -1,6 +1,6 @@ -# Ibexa DXP v4.0 +# [[= product_name =]] v4.0 **Version number**: v4.0 @@ -60,7 +60,7 @@ You can now configure and use the locking feature to lock a draft of a content i so that only an assigned person can edit it, and no other user can take it over. For more information, see the [Draft locking](https://doc.ibexa.co/en/latest/guide/workflow/workflow/#draft-locking) -and the relevant [user documentation](https://doc.ibexa.co/projects/userguide/en/latest/publishing/editorial_workflow/#releasing-locked-drafts). +and relevant [User Documentation](https://doc.ibexa.co/projects/userguide/en/latest/publishing/editorial_workflow/#releasing-locked-drafts). ### Online Editor is now based on CKEditor @@ -81,24 +81,26 @@ See [Managing migrations](https://doc.ibexa.co/en/latest/api/public_php_api_mana ### Decide whether alternative text for Image field is optional -Alternative text for an Image field is now optional by default. +Alternative text for an Image field is now optional by default. You can set it as required when adding the Image field to a content type. ### Configure what elements are available in the Page Builder for the content type [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] You can now select which page blocks, page layout and what edit mode are available in the Editor mode for the content type. + For more information, see [Working with Page](https://doc.ibexa.co/projects/userguide/en/latest/site_organization/working_with_page/#configure-block-display). ### Purge all submissions of given form [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -You can purge all submissions of a given form. +You can purge all submissions of a given form. + For more information, see [Forms](https://doc.ibexa.co/en/latest/guide/form_builder/forms/#form-submission-purging). ### External datasource handling Pesronalization has been given an option to fetch content feed from external sources. -### Category exclusion +### Category exclusion Personalization service has been enhanced with a feature which allows to exclude categories from the recommendation response. See [Exclusions](https://doc.ibexa.co/projects/userguide/en/latest/personalization/filters/#exclusions). @@ -115,6 +117,6 @@ for full details of changes and how they influence your project. ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Content v4.0](https://github.com/ibexa/content/releases/tag/v4.0.0) | [Ibexa Experience v4.0](https://github.com/ibexa/experience/releases/tag/v4.0.0) | [Ibexa Commerce v4.0](https://github.com/ibexa/commerce/releases/tag/v4.0.0) +| [[[= product_name_content =]] v4.0](https://github.com/ibexa/content/releases/tag/v4.0.0) | [[[= product_name_exp =]] v4.0](https://github.com/ibexa/experience/releases/tag/v4.0.0) | [[[= product_name_com =]] v4.0](https://github.com/ibexa/commerce/releases/tag/v4.0.0) diff --git a/docs/release_notes/ibexa_dxp_v4.1.md b/docs/release_notes/ibexa_dxp_v4.1.md index 162d36c79f..51572ecb30 100644 --- a/docs/release_notes/ibexa_dxp_v4.1.md +++ b/docs/release_notes/ibexa_dxp_v4.1.md @@ -86,6 +86,6 @@ which prevents multiple processes from executing the same migration and causing ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Content v4.1](https://github.com/ibexa/content/releases/tag/v4.1.0) | [Ibexa Experience v4.1](https://github.com/ibexa/experience/releases/tag/v4.1.0) | [Ibexa Commerce v4.1](https://github.com/ibexa/commerce/releases/tag/v4.1.0) +| [[[= product_name_content =]] v4.1](https://github.com/ibexa/content/releases/tag/v4.1.0) | [[[= product_name_exp =]] v4.1](https://github.com/ibexa/experience/releases/tag/v4.1.0) | [[[= product_name_com =]] v4.1](https://github.com/ibexa/commerce/releases/tag/v4.1.0) diff --git a/docs/release_notes/ibexa_dxp_v4.2.md b/docs/release_notes/ibexa_dxp_v4.2.md index a52431591f..bdeea89b01 100644 --- a/docs/release_notes/ibexa_dxp_v4.2.md +++ b/docs/release_notes/ibexa_dxp_v4.2.md @@ -219,13 +219,13 @@ a `SegmentGroup` and `Segment` objects respectively, instead of numerical IDs. ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Content v4.2](https://github.com/ibexa/content/releases/tag/v4.2.0) | [Ibexa Experience v4.2](https://github.com/ibexa/experience/releases/tag/v4.2.0) | [Ibexa Commerce v4.2](https://github.com/ibexa/commerce/releases/tag/v4.2.0)| +| [[[= product_name_content =]] v4.2](https://github.com/ibexa/content/releases/tag/v4.2.0) | [[[= product_name_exp =]] v4.2](https://github.com/ibexa/experience/releases/tag/v4.2.0) | [[[= product_name_com =]] v4.2](https://github.com/ibexa/commerce/releases/tag/v4.2.0)| ## v4.2.1 -### Ibexa CDP +### [[= product_name_cdp =]] [[= product_name_base =]] Customer Data Center allows you to collect, connect and organize customer data from multiple sources. You can use them to build segments that allow you to create personalized customer experience for your brand. diff --git a/docs/release_notes/ibexa_dxp_v4.3.md b/docs/release_notes/ibexa_dxp_v4.3.md index b3f72f6153..3fad23ff6f 100644 --- a/docs/release_notes/ibexa_dxp_v4.3.md +++ b/docs/release_notes/ibexa_dxp_v4.3.md @@ -89,6 +89,7 @@ and can be used for recommendation engine filtering. This release brings you a new content type for private customers registering from the front page. We also prepared a migration command for already existing users to ease your upgrade process. + For more information, refer to upgrade documentation. ### API improvements @@ -119,9 +120,9 @@ The `TaxonomyEntryId` Search Criterion isn't available in Legacy search Engine. ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |--------------|------------|------------| -| [Ibexa Content v4.3](https://github.com/ibexa/content/releases/tag/v4.3.0) | [Ibexa Experience v4.3](https://github.com/ibexa/experience/releases/tag/v4.3.0) | [Ibexa Commerce v4.3](https://github.com/ibexa/commerce/releases/tag/v4.3.0)| +| [[[= product_name_content =]] v4.3](https://github.com/ibexa/content/releases/tag/v4.3.0) | [[[= product_name_exp =]] v4.3](https://github.com/ibexa/experience/releases/tag/v4.3.0) | [[[= product_name_com =]] v4.3](https://github.com/ibexa/commerce/releases/tag/v4.3.0)| ## v4.3.1 diff --git a/docs/release_notes/ibexa_dxp_v4.4.md b/docs/release_notes/ibexa_dxp_v4.4.md index d780d5cb4a..1d9056a707 100644 --- a/docs/release_notes/ibexa_dxp_v4.4.md +++ b/docs/release_notes/ibexa_dxp_v4.4.md @@ -21,7 +21,7 @@ A new welcome page greets you when opening Ibexa Digital Experience Platform. ![New Welcome Page](4.4_welcome_page.png) -### All-new Ibexa Commerce packages [[% include 'snippets/commerce_badge.md' %]] +### All-new [[= product_name_com =]] packages [[% include 'snippets/commerce_badge.md' %]] This release deprecates all Commerce packages that you've known from previous releases and brings a redesigned and reconstructed Commerce offering: @@ -89,14 +89,14 @@ For more information, see [Requesting access to the server](https://doc.ibexa.co Personalization engine introduces two new recommendation models: [predictive](https://doc.ibexa.co/projects/userguide/en/4.4/personalization/recommendation_models/#predictive) and [recurring purchase](https://doc.ibexa.co/projects/userguide/en/4.4/personalization/recommendation_models/#recurring-purchase). These two new models, based on mathematical approach, help to predict clients behavior and provide the best recommendations. -## Ibexa Connect +## [[= product_name_connect =]] -You can now take advantage of [Ibexa Connect](https://www.ibexa.co/products/ibexa-connect), +You can now take advantage of [[[= product_name_connect =]]](https://www.ibexa.co/products/ibexa-connect), an iPaaS (integration platform-as-a-service) which allows you to connect [[= product_name =]] with third-party applications. [[= product_name_connect =]] features a low-code drag-and-drop interface and hundreds of connectors to different services that help you automate business processes. -See [Ibexa Connect documentation](https://doc.ibexa.co/projects/connect/en/latest/). +See [[[= product_name_connect =]] documentation](https://doc.ibexa.co/projects/connect/en/latest/). ![Example of an Ibexa Connect scenario](4.4_connect_scenario_example.png) @@ -107,6 +107,7 @@ See [Ibexa Connect documentation](https://doc.ibexa.co/projects/connect/en/lates The codebase has undergone significant upgrades to rely on Flysystem v2. The Flysystem Adapter implementation now supports dynamic paths described by complex settings resolvable for the SiteAccess context. + For more information, see [Configuring the DFS IO handler](https://doc.ibexa.co/en/4.4/infrastructure_and_maintenance/clustering/clustering/#configuring-the-dfs-io-handler). If your custom project relies directly on a Flysystem features instead of using our IO abstraction, it requires an upgrade as well, @@ -115,7 +116,8 @@ using [these instructions](https://flysystem.thephpleague.com/docs/upgrade-from- ### Dedicated migration type for Corporate Accounts To simplify data migration, you can now create a corporate account with underlying objects such as members group and address book. -You can also extract those objects as references. +You can also extract those objects as references. + For more information on data migration actions, see [Data migration actions](https://doc.ibexa.co/en/4.4/content_management/data_migration/data_migration_actions/#data-migration-actions). ### API improvements @@ -144,7 +146,7 @@ The following Commerce packages are deprecated as of this release and will be re - `ibexa/commerce-shop-ui` They will be maintained by [[= product_name_name =]] with fixes, including security fixes, but they won't be further developed. -Old packages are replaced by [the all-new Ibexa Commerce packages](#all-new-ibexa-commerce-packages) with more +Old packages are replaced by [the all-new [[= product_name_com =]] packages](#all-new-ibexa-commerce-packages) with more to come in the upcoming releases. #### Flysystem @@ -154,6 +156,6 @@ to come in the upcoming releases. ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce | +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]] | |------------------------|---------------------------|-------------------------| -| [Ibexa Content v4.4](https://github.com/ibexa/content/releases/tag/v4.4.0) | [Ibexa Experience v4.4](https://github.com/ibexa/experience/releases/tag/v4.4.0) | [Ibexa Commerce v4.4](https://github.com/ibexa/commerce/releases/tag/v4.4.0) | +| [[[= product_name_content =]] v4.4](https://github.com/ibexa/content/releases/tag/v4.4.0) | [[[= product_name_exp =]] v4.4](https://github.com/ibexa/experience/releases/tag/v4.4.0) | [[[= product_name_com =]] v4.4](https://github.com/ibexa/commerce/releases/tag/v4.4.0) | diff --git a/docs/release_notes/ibexa_dxp_v4.5.md b/docs/release_notes/ibexa_dxp_v4.5.md index 6e8e6c845a..cfe05563c3 100644 --- a/docs/release_notes/ibexa_dxp_v4.5.md +++ b/docs/release_notes/ibexa_dxp_v4.5.md @@ -16,7 +16,7 @@ description: Ibexa DXP v4.5 adds new features to Ibexa Commerce, translation com ## Notable changes -### All-new Ibexa Commerce packages [[% include 'snippets/commerce_badge.md' %]] +### All-new [[= product_name_com =]] packages [[% include 'snippets/commerce_badge.md' %]] This release brings new packages to complement the redesigned and reconstructed Commerce offering. You can use them to further enhance your e-commerce presence: @@ -125,6 +125,7 @@ and allows supporting other transport types accepted by CDP. Currently, only `stream_file` transport is supported and can be initialized from the configuration. [[= product_name =]] v4.5 adds the abstraction that allows you to implement other transport types from third parties. + For more information, see [CDP configuration](https://doc.ibexa.co/en/4.5/cdp/cdp_activation/#configuration). ### API improvements @@ -206,9 +207,9 @@ It's no longer necessary to take other taxonomies into account when creating tag You can now enhance password security with a setting that prevents using passwords that have been exposed in a public breach. To do it, the system checks the password against known password dumps by using the https://haveibeenpwned.com/ API. -See [Breached passwords](https://doc.ibexa.co/en/4.5/users/user_management/#breached-passwords) for more information. +For more information, see [Breached passwords](https://doc.ibexa.co/en/4.5/users/user_management/#breached-passwords). -### Ibexa Connect +### [[= product_name_connect =]] For list of changes in [[= product_name_connect =]], see [Ibexa app release notes](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_app_release_notes/). @@ -228,9 +229,9 @@ Deprecations: ## Full changelog -| Ibexa Content | Ibexa Experience | Ibexa Commerce| +| [[= product_name_content =]] | [[= product_name_exp =]] | [[= product_name_com =]]| |---------------|------------------|---------------| -| [Ibexa Content v4.5](https://github.com/ibexa/content/releases/tag/v4.5.0) | [Ibexa Experience v4.5](https://github.com/ibexa/experience/releases/tag/v4.5.0) | [Ibexa Commerce v4.5](https://github.com/ibexa/commerce/releases/tag/v4.5.0) | +| [[[= product_name_content =]] v4.5](https://github.com/ibexa/content/releases/tag/v4.5.0) | [[[= product_name_exp =]] v4.5](https://github.com/ibexa/experience/releases/tag/v4.5.0) | [[[= product_name_com =]] v4.5](https://github.com/ibexa/commerce/releases/tag/v4.5.0) | ## v4.5.1 diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index 33c21a8ba0..b8ccb3eeb2 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -16,7 +16,7 @@ description: Ibexa DXP v4.6 brings improvements to Commerce, PIM and Personaliza ## Notable changes -### Ibexa Headless +### [[= product_name_headless =]] [[= product_name_content =]] changes name to [[= product_name_headless =]] to emphasize [[= product_name_base =]]'s capacity for headless architecture. @@ -70,6 +70,7 @@ For more information, see [Edit embedded content items](https://doc.ibexa.co/pro With multiple changes to the back office UI intended to expose the most important information and actions, editors can now better focus on their work. The UI is now more friendly and appealing for marketers and editors, with simplified Content structure, designed with new and non-advanced users in mind. + For more information, see [Focus mode](https://doc.ibexa.co/projects/userguide/en/latest/getting_started/discover_ui/#focus-mode). ![Focus mode](img/4.6_focus_mode.png "Focus mode") @@ -141,9 +142,7 @@ on the dashboard within Recent activity block, or on the user profile. ![Recent activity log](img/4.6_activity_list.png "Recent activity log") -For more information, -see feature's [user documentation](https://doc.ibexa.co/projects/userguide/en/master/recent_activity/recent_activity/), -and [developer documentation](https://doc.ibexa.co/en/master/administration/recent_activity/recent_activity/). +For more information, see feature's [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/recent_activity/recent_activity/), and [Developer Documentation](https://doc.ibexa.co/en/master/administration/recent_activity/recent_activity/). #### back office search @@ -157,9 +156,7 @@ If a relevant suggestion occurs, it can be clicked, or navigated too with up/dow In the search result page, a spellcheck suggestion can be made. For example, if the searched text is "Comany", the result page may ask "Did you mean company?", which is clickable to relaunch the search with this word. -For more information, -see [user documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/), -and how to [customize autocompletion suggestions](https://doc.ibexa.co/en/master/administration/back_office/customize_search_suggestion/). +For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/), and how to [customize autocompletion suggestions](https://doc.ibexa.co/en/master/administration/back_office/customize_search_suggestion/). ##### Filtering and sorting @@ -167,9 +164,7 @@ The search result page can be sorted in other orders than relevance. Name, publi Filters can be applied to the search page to narrow down the results. -For more information, -see [user documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/#filtered-search), -and how to [customize search sorting](https://doc.ibexa.co/en/master/administration/back_office/customize_search_sorting/). +For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/#filtered-search), and how to [customize search sorting](https://doc.ibexa.co/en/master/administration/back_office/customize_search_sorting/). #### New and updated content type icons @@ -455,7 +450,7 @@ Any third party code that extends `\Ibexa\Contracts\Rest\Output\Generator` needs A new helper method `ibexa.helpers.contentType.getContentTypeDataByHref` has been introduced to help you get content type data in JavaScript. -### Ibexa Connect +### [[= product_name_connect =]] For a list of changes in [[= product_name_connect =]], see [Ibexa app release notes](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_app_release_notes/). @@ -465,11 +460,13 @@ New [[= product_name_connect =]] scenario block retrieves and displays data from Scenario block is a regular Page block and can be configured on field definition level as any other block. You also need to configure scenario block in the Page Builder. To do it, you need to provide name for the block, enter webhook link for the [[= product_name_connect =]] webhook and select the template to be used to present the webhook. -For more information, see [Ibexa Connect scenario block](https://doc.ibexa.co/en/master/content_management/pages/ibexa_connect_scenario_block/). +For more information, see [[[= product_name_connect =]] scenario block](https://doc.ibexa.co/en/master/content_management/pages/ibexa_connect_scenario_block/). ### DDEV -[[[= product_name =]] can officially be run on DDEV](https://ddev.readthedocs.io/en/latest/users/quickstart/#ibexa-dxp). For more information, see the [DDEV guide](https://doc.ibexa.co/en/master/getting_started/install_with_ddev/), which offers a step-by-step walkthrough for installing [[= product_name =]]. +[[[= product_name =]] can officially be run on DDEV](https://ddev.readthedocs.io/en/latest/users/quickstart/#ibexa-dxp). + +For more information, see the [DDEV guide](https://doc.ibexa.co/en/master/getting_started/install_with_ddev/), which offers a step-by-step walkthrough for installing [[= product_name =]]. ### Customer Data Platform (CDP) diff --git a/docs/resources/contributing/report_and_follow_issues.md b/docs/resources/contributing/report_and_follow_issues.md index 11b6e1786a..3434946b9b 100644 --- a/docs/resources/contributing/report_and_follow_issues.md +++ b/docs/resources/contributing/report_and_follow_issues.md @@ -16,7 +16,7 @@ If you find any, update them with your comment or additional information instead !!! caution "Security issues" - If you discover a security issue, please do not report it using regular channels, but instead take a look at [Security section](reporting_issues.md). + If you discover a security issue, please don't report it using regular channels, but instead take a look at [Security section](reporting_issues.md). If you have an [[= product_name =]] subscription, report your issues through the [support portal](https://support.ibexa.co) instead of JIRA. This ensures the issue can be quickly prioritized according to its impact. @@ -27,7 +27,7 @@ Click **Create** at the top of the bugtracker window and fill in the following f ||| |------|------| |**Project**|Select **Ibexa IBX**.| -|**Issue type**|Choose **Bug** or **Improvement** depending on what you're reporting, do not use other issue types (they're for internal use only).| +|**Issue type**|Choose **Bug** or **Improvement** depending on what you're reporting, don't use other issue types (they're for internal use only).| |**Summary**|Write a short sentence describing what you're reporting.| |**Priority**|Select the priority you consider the issue to be. Please try to keep a cool head while selecting it. A 1 pixel alignment bug isn't a "blocker".| |**Component/s**|This is important, as it makes your issue appear on the radar (dashboards, filters) of people dealing with various parts of Ibexa projects.| diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md index dcbce2baaf..7f0c85e521 100644 --- a/docs/resources/new_in_doc.md +++ b/docs/resources/new_in_doc.md @@ -10,8 +10,8 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Product guides -- [Ibexa Experience product guide](https://doc.ibexa.co/en/master/ibexa_products/ibexa_experience/) -- [Ibexa Commerce product guide](https://doc.ibexa.co/en/master/ibexa_products/ibexa_commerce/) +- [[[= product_name_exp =]] product guide](https://doc.ibexa.co/en/master/ibexa_products/ibexa_experience/) +- [[[= product_name_com =]] product guide](https://doc.ibexa.co/en/master/ibexa_products/ibexa_commerce/) - Added [page collecting all feature product guides](https://doc.ibexa.co/en/master/product_guides/product_guides/) ### Content management @@ -40,23 +40,23 @@ This page contains recent highlights and notable changes in [[= product_name =]] - Added a note about multi-repository scenario in [Managing migration](https://doc.ibexa.co/en/master/content_management/data_migration/managing_migrations/#migration-folders) - Updated the instructions for [Importing data](https://doc.ibexa.co/en/master/content_management/data_migration/importing_data/#built-in-functions) by mentioning the `env` function and a possibility of swapping content items assigned to a location -### Ibexa Cloud +### [[= product_name_cloud =]] -- Placed all articles about Ibexa Cloud [in a common location](https://doc.ibexa.co/en/master/ibexa_cloud/ibexa_cloud/) +- Placed all articles about [[= product_name_cloud =]] [in a common location](https://doc.ibexa.co/en/master/ibexa_cloud/ibexa_cloud/) -### Ibexa Engage +### [[= product_name_engage =]] -- [Added a landing page in the Ibexa Engage area](https://doc.ibexa.co/en/master/ibexa_engage/ibexa_engage/) +- [Added a landing page in the [[= product_name_engage =]] area](https://doc.ibexa.co/en/master/ibexa_engage/ibexa_engage/) ### Product guides -- [Ibexa Cloud product guide](https://doc.ibexa.co/en/master/ibexa_cloud/ibexa_cloud_guide/) +- [[[= product_name_cloud =]] product guide](https://doc.ibexa.co/en/master/ibexa_cloud/ibexa_cloud_guide/) ## June 2024 -### Ibexa Engage +### [[= product_name_engage =]] -- [Learn more about Ibexa Engage](https://doc.ibexa.co/en/master/ibexa_engage/install_ibexa_engage/) +- [Learn more about [[= product_name_engage =]]](https://doc.ibexa.co/en/master/ibexa_engage/install_ibexa_engage/) ### Search @@ -69,7 +69,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Infrastructure and maintenance -- [Updated Ibexa Cloud domain to ibexa.cloud](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/#4-push-the-project) +- [Updated [[= product_name_cloud =]] domain to ibexa.cloud](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/#4-push-the-project) - [v4.6.3 to v4.6.4 update instructions](https://doc.ibexa.co/en/master/update_and_migration/from_4.5/update_from_4.5/#v464) ### Documentation @@ -90,7 +90,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Product guides -- [Ibexa CDP product guide](https://doc.ibexa.co/en/master/cdp/cdp_guide/) +- [[[= product_name_cdp =]] product guide](https://doc.ibexa.co/en/master/cdp/cdp_guide/) ### Infrastructure and maintenance @@ -142,11 +142,11 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Dashboard -- New dashboard sections in user documentation: +- New dashboard sections in User Documentation: - [Dashboard](https://doc.ibexa.co/projects/userguide/en/master/getting_started/dashboard/dashboard/) - [Work with dashboard](https://doc.ibexa.co/projects/userguide/en/master/getting_started/dashboard/work_with_dashboard/) - [Dashboard block reference](https://doc.ibexa.co/projects/userguide/en/master/getting_started/dashboard/dashboard_block_reference/) -- Dashboard section in developer documentation: +- Dashboard section in Developer Documentation: - [Configure default dashboard](https://doc.ibexa.co/en/master/administration/dashboard/configure_default_dashboard/) - [Customize dashboard](https://doc.ibexa.co/en/master/administration/dashboard/customize_dashboard/) - [PHP API Dashboard service](https://doc.ibexa.co/en/master/administration/dashboard/php_api_dashboard_service/) @@ -181,7 +181,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] - New sections in taxonomy documentation: - [How to hide the delete button in large subtrees](https://doc.ibexa.co/en/master/content_management/taxonomy/taxonomy/#hide-delete-button-on-large-subtree) - [How to remove orphaned content items](https://doc.ibexa.co/en/master/content_management/taxonomy/taxonomy/#remove-orphaned-content-items) -- Updated information in user documentation: +- Updated information in User Documentation: - [Enhanced create and edit pages article](https://doc.ibexa.co/projects/userguide/en/master/content_management/create_edit_pages/) - [Edit embedded content items](https://doc.ibexa.co/projects/userguide/en/master/content_management/create_edit_content_items/#edit-embedded-content-items) @@ -192,7 +192,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Getting started - [[[= product_name_headless =]] product guide](https://doc.ibexa.co/en/master/ibexa_products/headless/) -- [Enhanced get started article](https://doc.ibexa.co/projects/userguide/en/master/getting_started/get_started/#edit-user-profile) in user documentation +- [Enhanced get started article](https://doc.ibexa.co/projects/userguide/en/master/getting_started/get_started/#edit-user-profile) in User Documentation ### Image management @@ -219,7 +219,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### PIM -- [Reorganized and updated information in user documentation](https://doc.ibexa.co/projects/userguide/en/master/pim/pim/) +- [Reorganized and updated information in User Documentation](https://doc.ibexa.co/projects/userguide/en/master/pim/pim/) ### Templating @@ -254,7 +254,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Others - [Redesigned requirements page](https://doc.ibexa.co/en/master/getting_started/requirements/) -- [Updated Ibexa Cloud CLI](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/) +- [Updated [[= product_name_cloud =]] CLI](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/) - [Updated React app block procedure](https://doc.ibexa.co/en/master/content_management/pages/react_app_block/) - [Added fulltext features in search](https://doc.ibexa.co/en/master/search/criteria_reference/fulltext_criterion/#supported-syntax) @@ -300,7 +300,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] - [Updated configuration for triggers](https://doc.ibexa.co/en/master/personalization/api_reference/tracking_api/#tracking-events-based-on-recommendations) - [Send messages with recommendations](https://doc.ibexa.co/en/master/personalization/integrate_recommendation_service/#send-messages-with-recommendations) -- [Email triggers](https://doc.ibexa.co/projects/userguide/en/master/personalization/triggers/) in user documentation +- [Email triggers](https://doc.ibexa.co/projects/userguide/en/master/personalization/triggers/) in User Documentation ### PIM @@ -322,7 +322,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Others -- Product guides integrated into developer documentation +- Product guides integrated into Developer Documentation - [Content management](https://doc.ibexa.co/en/master/content_management/content_management_guide/) - [Customer portal](https://doc.ibexa.co/en/master/customer_management/customer_portal/) - [Form Builder](https://doc.ibexa.co/en/master/content_management/forms/form_builder_guide/) @@ -336,7 +336,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### New home page -- Redesigned [home page for the user documentation](https://doc.ibexa.co/projects/userguide/en/master/) +- Redesigned [home page for User Documentation](https://doc.ibexa.co/projects/userguide/en/master/) ### Administration @@ -379,15 +379,15 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### New home page -- Redesigned [home page for the developer documentation](https://doc.ibexa.co/en/master/) +- Redesigned [home page for Developer Documentation](https://doc.ibexa.co/en/master/) ### Getting started -- New cautions in [Install on Ibexa Cloud](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/) about using `cloud.ibexa.co` instead of `platform.sh` +- New cautions in [Install on [[= product_name_cloud =]]](https://doc.ibexa.co/en/master/getting_started/install_on_ibexa_cloud/) about using `cloud.ibexa.co` instead of `platform.sh` ### Content management -- New Page block [Ibexa Connect scenario block](https://doc.ibexa.co/en/master/content_management/pages/ibexa_connect_scenario_block/) +- New Page block [[[= product_name_connect =]] scenario block](https://doc.ibexa.co/en/master/content_management/pages/ibexa_connect_scenario_block/) - Updated [Create custom Page blocks](https://doc.ibexa.co/en/master/content_management/pages/create_custom_page_block/#add-block-javascript) ### Customer Portal @@ -397,14 +397,14 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Personalization - [Multiple attributes in submodel computation](https://doc.ibexa.co/en/master/personalization/api_reference/recommendation_api/#submodel-parameters) -- [Multiple attributes in submodel computation](https://doc.ibexa.co/projects/userguide/en/master/personalization/recommendation_models/#submodels) in user documentation +- [Multiple attributes in submodel computation](https://doc.ibexa.co/projects/userguide/en/master/personalization/recommendation_models/#submodels) in User Documentation ### PIM - Updated [Enable purchasing products](https://doc.ibexa.co/en/master/pim/enable_purchasing_products/#region-and-currency) - [Virtual products](https://doc.ibexa.co/en/master/pim/products/#product-types) -- [Virtual products in user documentation](https://doc.ibexa.co/projects/userguide/en/master/pim/create_virtual_product/) -- [Work with product attributes](https://doc.ibexa.co/projects/userguide/en/master/pim/work_with_product_attributes/) in user documentation +- [Virtual products in User Documentation](https://doc.ibexa.co/projects/userguide/en/master/pim/create_virtual_product/) +- [Work with product attributes](https://doc.ibexa.co/projects/userguide/en/master/pim/work_with_product_attributes/) in User Documentation ### REST API - Added example of input payload in JSON format for [ContentTypeCreate in REST API reference](https://doc.ibexa.co/en/master/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-create-content-type) @@ -444,7 +444,7 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Personalization - [Email triggers](https://doc.ibexa.co/en/master/personalization/integrate_recommendation_service/#send-messages-with-recommendations) -- [Email triggers](https://doc.ibexa.co/projects/userguide/en/master/personalization/triggers/) in user documentation +- [Email triggers](https://doc.ibexa.co/projects/userguide/en/master/personalization/triggers/) in User Documentation ### Search @@ -455,8 +455,8 @@ This page contains recent highlights and notable changes in [[= product_name =]] ### Commerce -- [Shipping methods management](https://doc.ibexa.co/projects/userguide/en/master/commerce/shipping_management/work_with_shipping_methods/) in user documentation -- [Payment methods management](https://doc.ibexa.co/projects/userguide/en/master/commerce/payment/work_with_payments/) in user documentation +- [Shipping methods management](https://doc.ibexa.co/projects/userguide/en/master/commerce/shipping_management/work_with_shipping_methods/) in User Documentation +- [Payment methods management](https://doc.ibexa.co/projects/userguide/en/master/commerce/payment/work_with_payments/) in User Documentation - Stock Search Criteria and Aggregation: - [ProductStockRangeAggregation](https://doc.ibexa.co/en/master/search/aggregation_reference/productstockrange_aggregation/) - [ProductStock](https://doc.ibexa.co/en/master/search/criteria_reference/productstock_criterion/) diff --git a/docs/resources/phpstorm_plugin.md b/docs/resources/phpstorm_plugin.md index 7a43117a75..9a0a6833da 100644 --- a/docs/resources/phpstorm_plugin.md +++ b/docs/resources/phpstorm_plugin.md @@ -35,7 +35,7 @@ and select the downloaded file. ## Configuration Plugin configuration is available in PhpStorm settings/preferences (depending on your system), -under **PHP** > **Frameworks** > **Ibexa DXP**. +under **PHP** > **Frameworks** > **[[= product_name =]]**. You can use it to: @@ -60,20 +60,20 @@ on wizard data. ### Project wizard The plugin enables creating a new [[= product_name =]] project directly from PhpStorm. -To do it, select **File** > **New Project...** > **Ibexa DXP**. +To do it, select **File** > **New Project...** > **[[= product_name =]]**. In project settings form you can choose: - Location of the project -- Product edition: Ibexa OSS, Ibexa Content, [[= product_name_exp =]], [[= product_name_com =]] +- Product edition: [[= product_name_oss =]], [[= product_name_content =]], [[= product_name_exp =]], [[= product_name_com =]] - Authentication token (for Content, Experience and Commerce editions) - Product version: Default (latest LTS version), Latest (fast track or LTS), Latest LTS and "Next 3.x" (unstable, based on the 3.x branch) and "Next 4.x" (unstable, based on the 4.x branch) -- Generate [Ibexa Cloud configuration](install_on_ibexa_cloud.md) +- Generate [[[= product_name_cloud =]] configuration](install_on_ibexa_cloud.md) - Composer settings ![Create a project](phpstorm_plugin_create_project.png) -If you do not provide credentials for https://updates.ibexa.co/, the plugin uses the installation key and token password stored in global Composer configuration. Otherwise, it creates an `auth.json` file. +If you don't provide credentials for https://updates.ibexa.co/, the plugin uses the installation key and token password stored in global Composer configuration. Otherwise, it creates an `auth.json` file. You can find details of the installation procedure in Composer log window. @@ -104,7 +104,7 @@ The plugin provides the following built-in file templates: | Value object visitor | REST value visitor class based on `Ibexa\Contracts\Rest\Output\ValueObjectVisitor` | | Workflow action listener | Workflow action listener class based on `Ibexa\Contracts\Workflow\Event\Action\AbstractTransitionWorkflowActionListener` | -The templates are available in, for example, the context menu in **Project window** > **New** > **Ibexa DXP**. +The templates are available in, for example, the context menu in **Project window** > **New** > **[[= product_name =]]**. The list of available file templates depends on the [[= product_name =]] edition used by the project. @@ -170,7 +170,7 @@ To customize live templates, go to **File** > **Settings**/**Preferences** > **E ### Autocompletion in configuration files -Plugin provides autocompletion for Ibexa DXP configuration structure in YAML files placed in `config/packages/`. +Plugin provides autocompletion for [[= product_name =]] configuration structure in YAML files placed in `config/packages/`. Besides configuration structure, for the following YAML keys addition suggestions are available: diff --git a/docs/search/aggregation_reference/rawrange_aggregation.md b/docs/search/aggregation_reference/rawrange_aggregation.md index fb7e2465b7..8084c89b3f 100644 --- a/docs/search/aggregation_reference/rawrange_aggregation.md +++ b/docs/search/aggregation_reference/rawrange_aggregation.md @@ -12,7 +12,7 @@ The [RawRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Cont !!! caution - To keep your project search engine independent, do not use the `RawRangeAggregation` Aggregation in production code. + To keep your project search engine independent, don't use the `RawRangeAggregation` Aggregation in production code. Valid use cases are: testing, or temporary (one-off) tools. ## Example diff --git a/docs/search/aggregation_reference/rawstats_aggregation.md b/docs/search/aggregation_reference/rawstats_aggregation.md index 6350c476f9..a4b76c65b1 100644 --- a/docs/search/aggregation_reference/rawstats_aggregation.md +++ b/docs/search/aggregation_reference/rawstats_aggregation.md @@ -18,7 +18,7 @@ and provides statistical information for the values. You can use the provided ge !!! caution - To keep your project search engine independent, do not use the `RawStatsAggregation` Aggregation in production code. + To keep your project search engine independent, don't use the `RawStatsAggregation` Aggregation in production code. Valid use cases are: testing, or temporary (one-off) tools. ## Example diff --git a/docs/search/aggregation_reference/rawterm_aggregation.md b/docs/search/aggregation_reference/rawterm_aggregation.md index 3eb69544df..c7ce430b46 100644 --- a/docs/search/aggregation_reference/rawterm_aggregation.md +++ b/docs/search/aggregation_reference/rawterm_aggregation.md @@ -11,7 +11,7 @@ The [RawTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contr !!! caution - To keep your project search engine independent, do not use the `RawTermAggregation` Aggregation in production code. + To keep your project search engine independent, don't use the `RawTermAggregation` Aggregation in production code. Valid use cases are: testing, or temporary (one-off) tools. ## Example diff --git a/docs/search/criteria_reference/customprice_criterion.md b/docs/search/criteria_reference/customprice_criterion.md index 3afc709501..93e8ab12ca 100644 --- a/docs/search/criteria_reference/customprice_criterion.md +++ b/docs/search/criteria_reference/customprice_criterion.md @@ -7,7 +7,7 @@ The `CustomPrice` Search Criterion searches for products by their custom price f - `value` - a `Money\Money` object representing the price in a specific currency - (optional) `operator` - Operator constant (EQ, GT, GTE, LT, LTE, default EQ) - (optional) `customerGroup` - a `CustomerGroupInterface` object representing the customer group to show prices for. -If you do not provide a customer group, the query uses the group related to the current user. +If you don't provide a customer group, the query uses the group related to the current user. ## Limitations diff --git a/docs/search/criteria_reference/isfieldempty_criterion.md b/docs/search/criteria_reference/isfieldempty_criterion.md index 0151abf906..3cccbedb25 100644 --- a/docs/search/criteria_reference/isfieldempty_criterion.md +++ b/docs/search/criteria_reference/isfieldempty_criterion.md @@ -25,7 +25,7 @@ $query->query = new Criterion\IsFieldEmpty('title'); ## Use case -You can use the `IsFieldEmpty` Criterion to search for articles that do not have an image: +You can use the `IsFieldEmpty` Criterion to search for articles that don't have an image: ``` php hl_lines="4" $query = new LocationQuery; diff --git a/docs/search/criteria_reference/search_criteria_reference.md b/docs/search/criteria_reference/search_criteria_reference.md index 83d3ce4df1..bf98c31017 100644 --- a/docs/search/criteria_reference/search_criteria_reference.md +++ b/docs/search/criteria_reference/search_criteria_reference.md @@ -11,7 +11,7 @@ Criteria can take some of the following arguments: - `target` - when the Criterion supports targeting a specific field, example: `FieldDefinition` or Metadata identifier - `value` - the value(s) to filter on, typically a scalar or array of scalars -- `operator` - constants on `Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator`: `IN`, `EQ`, `GT`, `GTE`, `LT`, `LTE`, `LIKE`, `BETWEEN`, `CONTAINS`. Most Criteria do not expose this and select `EQ` or `IN` depending on whether the value is scalar or an array. `IN` and `BETWEEN` always act on an array of values, while the other operators act on single scalar value +- `operator` - constants on `Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator`: `IN`, `EQ`, `GT`, `GTE`, `LT`, `LTE`, `LIKE`, `BETWEEN`, `CONTAINS`. Most Criteria don't expose this and select `EQ` or `IN` depending on whether the value is scalar or an array. `IN` and `BETWEEN` always act on an array of values, while the other operators act on single scalar value - `valueData` - additional value data, required by some Criteria, for instance `MapLocationDistance` Support and capabilities of individual Criteria can depend on the search engine. diff --git a/docs/search/search_criteria_and_sort_clauses.md b/docs/search/search_criteria_and_sort_clauses.md index 57adec1227..3d8d0f70ce 100644 --- a/docs/search/search_criteria_and_sort_clauses.md +++ b/docs/search/search_criteria_and_sort_clauses.md @@ -30,7 +30,7 @@ In such cases you can implement a custom Criterion or Sort Clause, together with !!! caution "Using Field Criterion or Sort Clause with large databases" - Field Criterion and Sort Clause do not perform well by design when using SQL database. + Field Criterion and Sort Clause don't perform well by design when using SQL database. If you have a large database and want to use them, you either need to use the Solr search engine, or develop your own Custom Criterion or Sort Clause. This way you can avoid using the attributes (fields) database table, and instead use a custom simplified table which can handle the amount of data you have. diff --git a/docs/search/search_engines/elastic_search/configure_elastic_search.md b/docs/search/search_engines/elastic_search/configure_elastic_search.md index cb594c7079..b33b98e615 100644 --- a/docs/search/search_engines/elastic_search/configure_elastic_search.md +++ b/docs/search/search_engines/elastic_search/configure_elastic_search.md @@ -171,7 +171,7 @@ For more information, see [Set retries](https://www.elastic.co/guide/en/elastics ## Configure Elasticsearch Cloud As an alternative to using your own cluster, you can use Elasticsearch Cloud, a commercial SaaS solution. -With Elasticsearch Cloud you do not have to build or manage your own Elasticsearch cluster. +With Elasticsearch Cloud you don't have to build or manage your own Elasticsearch cluster. Also, you do all the configuration and administration in a graphical user interface. To connect to a cloud solution with [[= product_name =]], you must set the `elastic_cloud_id` parameter by @@ -283,7 +283,7 @@ ibexa_elasticsearch: pass: ~ ``` -If you do not have a client certificate signed by public certificate authority, +If you don't have a client certificate signed by public certificate authority, but you have a self-signed CA certificate generated by `elasticsearch-certutil` or another tool (for example for development purposes), use the following `ssl` configuration: @@ -387,6 +387,7 @@ Index names use the following pattern: ``` - `settings` - Settings under this key control all aspects related to an index. + For more information and a list of available settings, see [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/7.x/index-modules.html#index-modules-settings). For example, you can define settings that convert text into a format that is optimized for @@ -409,6 +410,7 @@ For more information and a list of available settings, see [Elasticsearch docume ``` - `mappings` - Settings under this key define mapping for fields in the index. + For more information about mappings, see [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/7.x/mapping.html). When you create a custom index template, with settings for your own field and document @@ -501,6 +503,7 @@ In your copy of the default template, change the pattern as follows: ``` This pattern matches on English. + For more information about specifying the pattern for your language, see [Define a template](#define-a-template). #### Create config for language specific analyzer diff --git a/docs/search/search_engines/elastic_search/install_elastic_search.md b/docs/search/search_engines/elastic_search/install_elastic_search.md index 9d31f97254..9818606777 100644 --- a/docs/search/search_engines/elastic_search/install_elastic_search.md +++ b/docs/search/search_engines/elastic_search/install_elastic_search.md @@ -64,9 +64,12 @@ All configuration is made in the `/config/packages/ibexa_elasticsearch.yaml` fil the Elasticsearch documentation. First, decide how [[= product_name =]] connects to Elasticsearch and configure other connection settings. + For more information, see [Configuring connections](configure_elastic_search.md#configure-connections). -Then, define a field type mappings template that instructs Elasticsearch to interpret [[= product_name =]] fields as specific types. For more information, see [Configuring field type mappings](configure_elastic_search.md#define-field-type-mapping-templates). +Then, define a field type mappings template that instructs Elasticsearch to interpret [[= product_name =]] fields as specific types. + +For more information, see [Configuring field type mappings](configure_elastic_search.md#define-field-type-mapping-templates). ## Push the templates @@ -88,5 +91,5 @@ php bin/console ibexa:reindex !!! caution "Risks of premature indexing" - Do not reindex your data before you create index templates. + Don't reindex your data before you create index templates. Otherwise Elasticsearch attempts to use its [dynamic field mapping](https://www.elastic.co/guide/en/elasticsearch/reference/7.7/dynamic-field-mapping.html) feature to create type mappings automatically. \ No newline at end of file diff --git a/docs/search/search_engines/legacy_search_engine/legacy_search_overview.md b/docs/search/search_engines/legacy_search_engine/legacy_search_overview.md index dfc084b434..1a2eebf753 100644 --- a/docs/search/search_engines/legacy_search_engine/legacy_search_overview.md +++ b/docs/search/search_engines/legacy_search_engine/legacy_search_overview.md @@ -8,6 +8,7 @@ Legacy search engine is the default search engine. it's SQL-based and uses Doctr The connections are defined in the same way as for storage engine, and no further specific configuration is needed. Legacy search engine is recommended for basic needs and isn't intended in production. It allows you to use filtering and fulltext search, but with some limitations. + For more information, check [search engine comparison](search_engines.md#search-engines-comparison) !!! tip diff --git a/docs/search/search_engines/solr_search_engine/install_solr.md b/docs/search/search_engines/solr_search_engine/install_solr.md index 02c3f380b3..8477f3e79d 100644 --- a/docs/search/search_engines/solr_search_engine/install_solr.md +++ b/docs/search/search_engines/solr_search_engine/install_solr.md @@ -71,7 +71,7 @@ This setting is **required** if you want to see the changes after publish. it's ### Generate Solr configuration automatically The command line tool `bin/generate-solr-config.sh` generates Solr 7 configuration automatically. -It can be used for deploying to Ibexa Cloud (Platform.sh) and on-premise installs. +It can be used for deploying to [[= product_name_cloud =]] (Platform.sh) and on-premise installs. Execute the script from the [[= product_name =]] root directory for further information: @@ -227,7 +227,10 @@ ibexa_solr: This solution uses the default SolrCloud [document routing strategy: `compositeId`](https://lucene.apache.org/solr/guide/7_7/shards-and-indexing-data-in-solrcloud.html#ShardsandIndexingDatainSolrCloud-DocumentRouting). ### Solr Basic HTTP Authorization -Solr core can be secured with Basic HTTP Authorization. See more information here: [Solr Basic Authentication Plugin](https://cwiki.apache.org/confluence/display/solr/Basic+Authentication+Plugin). +Solr core can be secured with Basic HTTP Authorization. + +For more information, see [Solr Basic Authentication Plugin](https://cwiki.apache.org/confluence/display/solr/Basic+Authentication+Plugin). + In the example below we configured Solr Bundle to work with secured Solr core. ``` yaml diff --git a/docs/search/sort_clause_reference/customfield_sort_clause.md b/docs/search/sort_clause_reference/customfield_sort_clause.md index ed8d9ff9a7..c171ba524c 100644 --- a/docs/search/sort_clause_reference/customfield_sort_clause.md +++ b/docs/search/sort_clause_reference/customfield_sort_clause.md @@ -12,7 +12,7 @@ sorts search results by raw search index fields. !!! caution - To keep your project search engine independent, do not use the `CustomField` Sort Clause in production code. + To keep your project search engine independent, don't use the `CustomField` Sort Clause in production code. Valid use cases are: testing, or temporary (one-off) tools. The `CustomField` Sort Clause isn't available in [Repository filtering](search_api.md#repository-filtering). diff --git a/docs/search/sort_clause_reference/customprice_sort_clause.md b/docs/search/sort_clause_reference/customprice_sort_clause.md index e0e126a763..1c43f029fa 100644 --- a/docs/search/sort_clause_reference/customprice_sort_clause.md +++ b/docs/search/sort_clause_reference/customprice_sort_clause.md @@ -7,7 +7,7 @@ The `CustomPrice` Sort Clause sorts search results by the product's custom price - `currency` - a `CurrencyInterface` object representing the currency to check price for [[= include_file('docs/snippets/sort_direction.md') =]] - (optional) `customerGroup` - a `CustomerGroupInterface` object representing the customer group to check prices for. -If you do not provide a customer group, the query uses the group related to the current user. +If you don't provide a customer group, the query uses the group related to the current user. ## Limitations diff --git a/docs/search/sort_clause_reference/field_sort_clause.md b/docs/search/sort_clause_reference/field_sort_clause.md index ef63a746ce..8145a59188 100644 --- a/docs/search/sort_clause_reference/field_sort_clause.md +++ b/docs/search/sort_clause_reference/field_sort_clause.md @@ -4,7 +4,7 @@ The [`Field` Sort Clause](../../api/php_api/php_api_reference/classes/Ibexa-Cont sorts search results by the value of one of the content items' fields. Search results of the provided content type are sorted in field value order. -Results of the query that do not belong to the content type are ranked lower. +Results of the query that don't belong to the content type are ranked lower. ## Arguments diff --git a/docs/snippets/update/db/db_backup_warning.md b/docs/snippets/update/db/db_backup_warning.md index 4b94a1f91f..9f5bf1df31 100644 --- a/docs/snippets/update/db/db_backup_warning.md +++ b/docs/snippets/update/db/db_backup_warning.md @@ -4,6 +4,6 @@ After updating the database, clear the cache. - Do not use `--force` argument for `mysql` / `psql` commands when performing update queries. + Don't use `--force` argument for `mysql` / `psql` commands when performing update queries. If there is any problem during the update, it's best if the query fails immediately, so you can fix the underlying problem before you execute the update again. If you leave this for later you risk ending up with an incompatible database, though the problems might not surface immediately. diff --git a/docs/snippets/update/finish_the_update.md b/docs/snippets/update/finish_the_update.md index ed81a423ce..0fef50769c 100644 --- a/docs/snippets/update/finish_the_update.md +++ b/docs/snippets/update/finish_the_update.md @@ -1,6 +1,6 @@ ### A. Platform.sh changes -If you're hosting your site on Ibexa Cloud be aware of the fact that Varnish is enabled by default as of v1.13.5, v2.4.3 and v2.5.0. +If you're hosting your site on [[= product_name_cloud =]] be aware of the fact that Varnish is enabled by default as of v1.13.5, v2.4.3 and v2.5.0. If you're using Fastly, read about [how to disable Varnish](https://docs.platform.sh/frameworks/ibexa/fastly.html#remove-varnish-configuration). ### B. Dump assets @@ -26,7 +26,7 @@ yarn encore prod When you resolve all conflicts and update `composer.lock`, commit the merge. You may or may not keep `composer.lock`, depending on your version management workflow. -If you do not want to keep it, run `git reset HEAD composer.lock` to remove it from the changes. +If you don't want to keep it, run `git reset HEAD composer.lock` to remove it from the changes. Run `git commit`, and adapt the message if necessary. Go back to `master`, and merge the `update-[[= target_version =]]` branch: diff --git a/docs/snippets/update/merge_composer.md b/docs/snippets/update/merge_composer.md index 7b60320efd..27079ad0a0 100644 --- a/docs/snippets/update/merge_composer.md +++ b/docs/snippets/update/merge_composer.md @@ -12,7 +12,7 @@ It's easiest to check out the version of `composer.lock` from the tag and add it git checkout --theirs composer.lock && git add composer.lock ``` -If you do not keep a copy of `composer.lock` in the branch, you may also remove it by running: +If you don't keep a copy of `composer.lock` in the branch, you may also remove it by running: ``` bash git rm composer.lock @@ -38,7 +38,7 @@ Use `git checkout -p` to selectively cancel those changes (and retain your addit git checkout -p composer.json ``` -Answer `no` (do not discard) to the requirement changes of `ezsystems` / `ibexa` dependencies. +Answer `no` (don't discard) to the requirement changes of `ezsystems` / `ibexa` dependencies. Answer `yes` (discard) to removals of your changes. After you're done, inspect the file (you can use an editor or run `git diff composer.json`). diff --git a/docs/templating/design_engine/add_new_design.md b/docs/templating/design_engine/add_new_design.md index e884cf8aa6..0cb5f8c672 100644 --- a/docs/templating/design_engine/add_new_design.md +++ b/docs/templating/design_engine/add_new_design.md @@ -118,4 +118,4 @@ it uses the template from the next configured design. In the case above, the engine does not find the footer template for the `campaign` SiteAccess, so it uses the one from `standard`. -This way you do not need to provide all templates for a new design, but only those that you want to be different than the fallback one. +This way you don't need to provide all templates for a new design, but only those that you want to be different than the fallback one. diff --git a/docs/templating/layout/add_search_form.md b/docs/templating/layout/add_search_form.md index abf5522f4d..349ac13cec 100644 --- a/docs/templating/layout/add_search_form.md +++ b/docs/templating/layout/add_search_form.md @@ -63,5 +63,5 @@ Create the `parts/search_form.html.twig` file: ``` This template renders only a basic query field and a submit button. -`'render_rest': false` ensures that the fields you do not explicitly add to the template aren't rendered +`'render_rest': false` ensures that the fields you don't explicitly add to the template aren't rendered (in this case, date selection, content type, and so on). diff --git a/docs/templating/queries_and_controllers/controllers.md b/docs/templating/queries_and_controllers/controllers.md index 6bdbca89bd..ade94ecd62 100644 --- a/docs/templating/queries_and_controllers/controllers.md +++ b/docs/templating/queries_and_controllers/controllers.md @@ -18,8 +18,8 @@ You indicate which controller to use in the [content view configuration](templat For a full example of using a custom controller, see [Embed content](embed_content.md#embed-relations-with-a-custom-controller). -If you do not want to use the default view controller and only use a custom one, -use the same configuration, but do not provide the `template` key. +If you don't want to use the default view controller and only use a custom one, +use the same configuration, but don't provide the `template` key. You have to indicate the template to use from the controller itself. !!! tip "Permissions for custom controllers" diff --git a/docs/templating/queries_and_controllers/create_custom_query_type.md b/docs/templating/queries_and_controllers/create_custom_query_type.md index be3700841e..7f235d1b57 100644 --- a/docs/templating/queries_and_controllers/create_custom_query_type.md +++ b/docs/templating/queries_and_controllers/create_custom_query_type.md @@ -32,8 +32,8 @@ The name defined in `getName()` is the one you use to identify the Query type in Query type name must be unique. The `getQuery()` method constructs the query based on Search Criteria and Sort Clauses. -See [Content search](search_api.md) for more information about queries -and [Search reference](search_criteria_reference.md) for a reference of available Criteria and Sort Clauses. + +For more information, see [Content search](search_api.md) and [Search reference](search_criteria_reference.md). The `getSupportedParameters()` method provides the parameters you can set in content view configuration. diff --git a/docs/templating/twig_function_reference/cart_twig_functions.md b/docs/templating/twig_function_reference/cart_twig_functions.md index 4cdac70bc7..7028194154 100644 --- a/docs/templating/twig_function_reference/cart_twig_functions.md +++ b/docs/templating/twig_function_reference/cart_twig_functions.md @@ -10,7 +10,7 @@ You can use cart Twig functions to check whether products can be added to cart, ### `ibexa_can_be_added_to_cart()` -The `ibexa_can_be_added_to_cart()` function checks whether the provided product can be added to cart. It eliminates products that aren't available, products that do not have a price that corresponds to a currency selected for the cart, and products, for which VAT category isn't set. It also eliminates products that have variants but aren't one of those variants. +The `ibexa_can_be_added_to_cart()` function checks whether the provided product can be added to cart. It eliminates products that aren't available, products that don't have a price that corresponds to a currency selected for the cart, and products, for which VAT category isn't set. It also eliminates products that have variants but aren't one of those variants. ``` html+twig {% set is_disabled = (is_disabled or ibexa_can_be_added_to_cart(product) == false)|default(false) %} diff --git a/docs/templating/urls_and_routes/custom_breadcrumbs.md b/docs/templating/urls_and_routes/custom_breadcrumbs.md index 8a8c8c667e..4777eb7485 100644 --- a/docs/templating/urls_and_routes/custom_breadcrumbs.md +++ b/docs/templating/urls_and_routes/custom_breadcrumbs.md @@ -64,7 +64,7 @@ which implements this interface and provides access to the WhiteOctober breadcru Every breadcrumb generator has to add a `translationParameters` array with `type`, `identifier` and `content_type_id`. Always create all three keys and leave the elements empty if not needed. -If you can't or do not want to use `AbstractWhiteOctoberBreadcrumbsGenerator`, +If you can't or don't want to use `AbstractWhiteOctoberBreadcrumbsGenerator`, your generator's `renderBreadcrumbs()` method must handle rendering the HTML code for the breadcrumbs. The highest priority generator which matches `canRender()` renders the breadcrumbs for the current request. diff --git a/docs/tutorials/beginner_tutorial/4_display_single_content_item.md b/docs/tutorials/beginner_tutorial/4_display_single_content_item.md index f7048b30e3..d51ae5c28b 100644 --- a/docs/tutorials/beginner_tutorial/4_display_single_content_item.md +++ b/docs/tutorials/beginner_tutorial/4_display_single_content_item.md @@ -79,7 +79,7 @@ Go back to `config/packages/ibexa.yaml` and add the following configuration (und site: content_view: full: - # existing keys, do not change them + # existing keys, don't change them ride: template: full/ride.html.twig match: @@ -90,7 +90,7 @@ This tells the application to use this template whenever it renders the full vie ### Check the Ride full view -Because you do not have a list of Rides on the front page yet, you cannot simply click a Ride to preview it. +Because you don't have a list of Rides on the front page yet, you cannot simply click a Ride to preview it. But you still can see how the template works in two ways: #### Preview in the back office diff --git a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md index 1bb83b4f18..9cd8d436e2 100644 --- a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md +++ b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md @@ -49,6 +49,7 @@ To get this list, you use a Query Type. ## Create a QueryType for the home page QueryType objects are used to limit and sort results for content item queries. + For more information, see [Built-In Query Types](built-in_query_types.md). Here, you need to display `ride` objects that have been published (are visible). @@ -101,7 +102,7 @@ In the view configuration for the home page indicate that this view uses the Que site: content_view: full: - # existing keys, do not change them + # existing keys, don't change them home_page: controller: ibexa_query::pagingQueryAction template: full/home_page.html.twig diff --git a/docs/tutorials/beginner_tutorial/8_enable_account_registration.md b/docs/tutorials/beginner_tutorial/8_enable_account_registration.md index 35579ace6f..e178f21197 100644 --- a/docs/tutorials/beginner_tutorial/8_enable_account_registration.md +++ b/docs/tutorials/beginner_tutorial/8_enable_account_registration.md @@ -171,7 +171,7 @@ The User you have just created has the roles assigned to this group. !!! tip You can change the group in which new Users are placed (but you don't need to do it for this tutorial). - See [Registering new users](user_registration.md) for more information. + For more information, see [Registering new users](user_registration.md). At this point you don't want anyone who registers to be able to add content to the website. That's why you'll create a new user group with additional permissions. diff --git a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md index aa6e1b68fc..c2d0d1da0f 100644 --- a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md +++ b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md @@ -8,6 +8,7 @@ description: Learn how to create the Type class which contains the logic for the The Type contains logic of the field type: validating data, transforming from various formats, describing the validators, etc. In this example Point 2D field type extends the `Ibexa\Contracts\Core\FieldType\Generic\Type` class. + For more information about the Type class of a field type, see [Type class](type_and_value.md#type-class). ## Field type identifier diff --git a/docs/tutorials/generic_field_type/3_create_form_for_point2d.md b/docs/tutorials/generic_field_type/3_create_form_for_point2d.md index ad6ab18cfb..a6df29922a 100644 --- a/docs/tutorials/generic_field_type/3_create_form_for_point2d.md +++ b/docs/tutorials/generic_field_type/3_create_form_for_point2d.md @@ -17,8 +17,9 @@ This method adds fields for `x` and `y` coordinates. ## Add a Form Mapper Interface -The FormMapper adds the field definitions into Symfony forms using the `add()` method. +The FormMapper adds the field definitions into Symfony forms using the `add()` method. The `FieldValueFormMapperInterface` provides an edit form for your field type in the administration interface. + For more information about the FormMappers, see [field type form and template](form_and_template.md). First, implement a `FieldValueFormMapperInterface` interface (`Ibexa\Contracts\ContentForms\FieldType\FieldValueFormMapperInterface`) to field type definition in the `src/FieldType/Point2D/Type.php`. diff --git a/docs/tutorials/generic_field_type/4_introduce_a_template.md b/docs/tutorials/generic_field_type/4_introduce_a_template.md index 353b390785..b429e4ef3c 100644 --- a/docs/tutorials/generic_field_type/4_introduce_a_template.md +++ b/docs/tutorials/generic_field_type/4_introduce_a_template.md @@ -12,7 +12,8 @@ In this case the most important variable is the `field`, an instance of `Ibexa\C In addition to its own metadata (`id`, `fieldDefIdentifier`, etc.), it exposes the field Value through the `value` property. Remember that field type templates can be overridden to tweak what is displayed and how. -For more information, see the documentation about [field type templates](form_and_template.md#content-view-templates). + +For more information, see [field type templates](form_and_template.md#content-view-templates). First, create a `point2d_field.html.twig` template in the `templates` directory. It defines the default display of a Point 2D. diff --git a/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md b/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md index 4dfafe5a6d..d636436282 100644 --- a/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md +++ b/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md @@ -14,7 +14,7 @@ Field types are responsible for: - Making the data searchable (if applicable) - Displaying fields -You can find more information in [field type documentation](field_types.md). +For more information, see [field type documentation](field_types.md). It describes how each component of a field type interacts with the various layers of the system, and how to implement them. ## Intended audience diff --git a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md index 85dd6bd28b..f2c76a909a 100644 --- a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md +++ b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md @@ -11,7 +11,7 @@ To set up the starter website, you need to follow these steps: To begin the tutorial, you need a clean installation of [[= product_name_exp =]]. -Get it by following the [Install Ibexa DXP](install_ibexa_dxp.md) guide. +Get it by following the [Install [[= product_name =]]](install_ibexa_dxp.md) guide. ## Add content types @@ -112,7 +112,7 @@ First, you can hide unneeded content items from the project root. Go to **Content structure** and select "Ibexa Digital Experience Platform". In the **Sub-items** tab, select all the current sub-items and click the **Hide** icon: -![Hiding content items you do not need](enterprise_tut_hide_content.png) +![Hiding content items you don't need](enterprise_tut_hide_content.png) Next, under "Ibexa Digital Experience Platform", create three Folders. Call them 'All Articles', 'Dog Breed Catalog' and 'All Tips'. Remember that you can **Save and close** them, but you should use the **Publish** button. diff --git a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md index 455311bcb2..d39b3e45a7 100644 --- a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md +++ b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md @@ -109,7 +109,7 @@ At this point you can add a new Content Scheduler block to your Page and fill it !!! tip - If you do not see the featured block template, you may need to clear the cache (using `php bin/console cache:clear`) and/or reload the app. + If you don't see the featured block template, you may need to clear the cache (using `php bin/console cache:clear`) and/or reload the app. Go back to editing the Home Page and drag a Content Scheduler block from the pane on the right to the main zone in the layout, above the Content List block. Select the block and click the Block Settings icon. diff --git a/docs/update_and_migration/from_1.x_2.x/update_app_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_app_to_2.5.md index ce025b7cdf..687a5f9706 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_app_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_app_to_2.5.md @@ -24,7 +24,9 @@ You need to install [Node.js](https://nodejs.org/en) and [Yarn](https://classic. In v2.5 it's still possible to use Assetic, like in earlier versions. However, if you're using the latest Bootstrap version, [`scssphp`](https://github.com/leafo/scssphp) doesn't compile correctly with Assetic. -In this case, use Webpack Encore. See [Importing assets from a bundle](importing_assets_from_bundle.md) for more information. +In this case, use Webpack Encore. + +For more information, see [Importing assets from a bundle](importing_assets_from_bundle.md). If you experience issues during the update, see [Troubleshooting](troubleshooting.md#cloning-failed-using-an-ssh-key). diff --git a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md index 0f73ab798a..5f35d929a1 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md @@ -118,7 +118,7 @@ Typically, what you previously would do in `getTemplateParameters()`, you'll now The definition of block parameters has to be moved from `createBlockDefinition()` to the [YAML configuration](create_custom_page_block.md) for your custom blocks. -For more information about how custom blocks are implemented in Page Builder, have a look at [Creating custom Page blocks](create_custom_page_block.md) for your custom blocks. +For more information about how custom blocks are implemented in Page Builder, see [Creating custom Page blocks](create_custom_page_block.md) for your custom blocks. For the migration of blocks from landing page to Page Builder, you'll need to provide a converter for attributes of custom blocks. For simple blocks you can use `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\DefaultConverter`. Custom converters must implement the `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\ConverterInterface` interface. @@ -779,7 +779,7 @@ The introduction of [support for PostgreSQL](databases.md#using-postgresql) incl It's now created based on [YAML configuration](https://github.com/ezsystems/ezpublish-kernel/blob/master/eZ/Bundle/EzPublishCoreBundle/Resources/config/storage/legacy/schema.yaml), using the new [`DoctrineSchemaBundle`](https://github.com/ezsystems/doctrine-dbal-schema). If you're updating your application according to the usual procedure, no additional actions are required. -However, if you do not update your meta-repository, you need to take two additional steps: +However, if you don't update your meta-repository, you need to take two additional steps: - enable `EzSystems\DoctrineSchemaBundle\DoctrineSchemaBundle()` in `AppKernel.php` - add [`ez_doctrine_schema`](https://github.com/ezsystems/ezplatform/blob/2.5/app/config/config.yml#L33) configuration diff --git a/docs/update_and_migration/from_2.5/to_3.3.latest.md b/docs/update_and_migration/from_2.5/to_3.3.latest.md index f563756254..0eadbcb1a3 100644 --- a/docs/update_and_migration/from_2.5/to_3.3.latest.md +++ b/docs/update_and_migration/from_2.5/to_3.3.latest.md @@ -164,7 +164,7 @@ Run the following scripts: !!! tip - Even if you do not plan to use Fastly shielding, it's recommended to update the VCL files for future compatibility. + Even if you don't plan to use Fastly shielding, it's recommended to update the VCL files for future compatibility. 1. Locate the `vendor/ezsystems/ezplatform-http-cache-fastly/fastly/ez_main.vcl` file and update your VCL file with the recent changes. 2. Do the same with `vendor/ezsystems/ezplatform-http-cache-fastly/fastly/ez_user_hash.vcl`. diff --git a/docs/update_and_migration/from_2.5/to_3.3.md b/docs/update_and_migration/from_2.5/to_3.3.md index 81688d60ac..fe1335aea3 100644 --- a/docs/update_and_migration/from_2.5/to_3.3.md +++ b/docs/update_and_migration/from_2.5/to_3.3.md @@ -47,7 +47,7 @@ If you haven't done it before, add the relevant meta-repository as an `upstream` Merge the current skeleton into your project: -=== "Ibexa Content" +=== "[[= product_name_content =]]t" ``` bash git remote add content-skeleton https://github.com/ibexa/content-skeleton.git @@ -55,7 +55,7 @@ Merge the current skeleton into your project: git merge v[[= latest_tag =]] --allow-unrelated-histories ``` -=== "Ibexa Experience" +=== "[[= product_name_exp =]]" ``` bash git remote add experience-skeleton https://github.com/ibexa/experience-skeleton.git @@ -63,7 +63,7 @@ Merge the current skeleton into your project: git merge v[[= latest_tag =]] --allow-unrelated-histories ``` -=== "Ibexa Commerce" +=== "[[= product_name_com =]]" ``` bash git remote add commerce-skeleton https://github.com/ibexa/commerce-skeleton.git diff --git a/docs/update_and_migration/from_3.3/to_4.0.md b/docs/update_and_migration/from_3.3/to_4.0.md index 0fa54faaa0..018a0ed264 100644 --- a/docs/update_and_migration/from_3.3/to_4.0.md +++ b/docs/update_and_migration/from_3.3/to_4.0.md @@ -108,7 +108,7 @@ php bin/console cache:clear Apply the following database update script: -### Ibexa DXP +### [[= product_name =]] === "MySQL" ``` bash diff --git a/docs/update_and_migration/from_3.3/update_from_3.3.md b/docs/update_and_migration/from_3.3/update_from_3.3.md index 076a5bc274..cc5175fd86 100644 --- a/docs/update_and_migration/from_3.3/update_from_3.3.md +++ b/docs/update_and_migration/from_3.3/update_from_3.3.md @@ -372,7 +372,7 @@ See [Update Flex server](#update-flex-server). !!! tip - Even if you do not plan to use Fastly shielding, it's recommended to update the VCL files for future compatibility. + Even if you don't plan to use Fastly shielding, it's recommended to update the VCL files for future compatibility. 1. Locate the `vendor/ezsystems/ezplatform-http-cache-fastly/fastly/ez_main.vcl` file and update your VCL file with the recent changes. 2. Do the same with `vendor/ezsystems/ezplatform-http-cache-fastly/fastly/ez_user_hash.vcl`. diff --git a/docs/update_and_migration/from_4.3/update_from_4.3.md b/docs/update_and_migration/from_4.3/update_from_4.3.md index 10ef903ab7..f86204efc7 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3.md @@ -8,11 +8,11 @@ This update procedure applies if you're using the newest v4.3 installation. This release deprecates all Commerce packages in[[= product_name =]]. They will be removed in v5. Until that time, they will be maintained by Ibexa with fixes, including security fixes, but they won't be further developed. -Old packages are replaced by [the all-new Ibexa Commerce packages](ibexa_dxp_v4.4.md#all-new-ibexa-commerce-packages). +Old packages are replaced by [the all-new [[= product_name_com =]] packages](ibexa_dxp_v4.4.md#all-new-ibexa-commerce-packages). For that reason, there are two update routes you can take. -A. If you do not use Commerce functionalities, you can proceed with removing them. +A. If you don't use Commerce functionalities, you can proceed with removing them. B. If you use Commerce functionalities based on the deprecated packages, you can continue to use them for the time being. diff --git a/docs/update_and_migration/from_4.3/update_from_4.3_new_commerce.md b/docs/update_and_migration/from_4.3/update_from_4.3_new_commerce.md index d55e776226..576482e6fc 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3_new_commerce.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3_new_commerce.md @@ -3,7 +3,7 @@ description: Update procedure to v4.4 for people who don't use Commerce packages --- # Update with new Commerce packages -This update procedure applies if you have a v4.3 installation, and you do not use Commerce packages. +This update procedure applies if you have a v4.3 installation, and you don't use Commerce packages. [[% include 'snippets/update/temporary_v4_conflicts.md' %]] @@ -145,7 +145,7 @@ composer recipe:install --force --reset -- oneup/flysystem-bundle ### Remove `ibexa/commerce-*` packages with dependencies Remove the following bundles from `config/bundles.php`. -You do not have to remove third-party bundles (`FOS\` to `JMS\`) if they're used by your installation. +You don't have to remove third-party bundles (`FOS\` to `JMS\`) if they're used by your installation. === "[[= product_name_content =]]" @@ -246,7 +246,7 @@ You do not have to remove third-party bundles (`FOS\` to `JMS\`) if they're used ``` Next, remove related extensions' configuration. -You do not have to remove third-party bundles (for example `config/packages/fos_rest.yaml`) if they're used by your installation. +You don't have to remove third-party bundles (for example `config/packages/fos_rest.yaml`) if they're used by your installation. === "[[= product_name_content =]]" @@ -299,8 +299,8 @@ Finally, remove related routes by deleting `config/routes/ibexa_commerce.yaml` f ### Update the database -Next, update the database if you're using Ibexa Commerce. -Ibexa Content and Ibexa Experience do not require the database update. +Next, update the database if you're using [[= product_name_com =]]. +[[= product_name_content =]] and [[= product_name_exp =]] don't require the database update. [[% include 'snippets/update/db/db_backup_warning.md' %]] @@ -320,7 +320,7 @@ Apply the following database update scripts: #### Ibexa Open Source -If you have no access to Ibexa DXP's `ibexa/installer` package, database upgrade isn't necessary. +If you have no access to [[= product_name =]]'s `ibexa/installer` package, database upgrade isn't necessary. ## Ensure password safety @@ -339,7 +339,7 @@ composer run post-install-cmd ### Customer Portal self-registration -If you're using Ibexa Experience or Ibexa Commerce, +If you're using [[= product_name_exp =]] or [[= product_name_com =]], you can now run data migration required by the Customer Portal applications feature to finish the update process: ```bash diff --git a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md index d1f7f335b3..6aad2dfb49 100644 --- a/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md +++ b/docs/update_and_migration/from_4.3/update_from_4.3_old_commerce.md @@ -8,7 +8,7 @@ This update procedure applies if you have a v4.3 installation, you use Commerce All commerce packages as of v4.4 are deprecated and will be removed in v5. Until that time, they will be maintained by Ibexa with fixes, including security fixes, but they won't be further developed. -Old packages are replaced by [the all-new Ibexa Commerce packages](ibexa_dxp_v4.4.md#all-new-ibexa-commerce-packages). +Old packages are replaced by [the all-new [[= product_name_com =]] packages](ibexa_dxp_v4.4.md#all-new-ibexa-commerce-packages). [[% include 'snippets/update/temporary_v4_conflicts.md' %]] @@ -174,8 +174,8 @@ ibexa: ### Update the database -Next, update the database if you're using Ibexa Commerce. -Ibexa Content and Ibexa Experience do not require the database update. +Next, update the database if you're using [[= product_name_com =]]. +[[= product_name_content =]] and [[= product_name_exp=]] don't require the database update. [[% include 'snippets/update/db/db_backup_warning.md' %]] @@ -215,7 +215,7 @@ composer run post-install-cmd ### Customer Portal self-registration -If you're using Ibexa Experience or Ibexa Commerce, +If you're using [[= product_name_exp =]] or [[= product_name_com =]], run data migration required by the Customer Portal applications feature: ```bash diff --git a/docs/update_and_migration/from_4.4/update_from_4.4.md b/docs/update_and_migration/from_4.4/update_from_4.4.md index c3efd53566..d2ad50bff2 100644 --- a/docs/update_and_migration/from_4.4/update_from_4.4.md +++ b/docs/update_and_migration/from_4.4/update_from_4.4.md @@ -84,7 +84,8 @@ ibexa_measurement: my_unit: { symbol: my, is_base_unit: true } ``` -Next, add unit conversion to `src/bundle/Resources/config/services/conversion.yaml`. +Next, add unit conversion to `src/bundle/Resources/config/services/conversion.yaml`. + For more information, see [Modify and add Measurement types and units](measurementfield.md#modify-and-add-measurement-types-and-units). ### Update the database @@ -193,7 +194,7 @@ composer run post-install-cmd ## Run data migration -If you're using Ibexa Experience or Ibexa Commerce, +If you're using [[= product_name_exp =]] or [[= product_name_com =]], you can now run data migration required by the Customer Portal and Commerce features to finish the update process: - Customer Portal [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] diff --git a/docs/update_and_migration/from_4.5/update_from_4.5.md b/docs/update_and_migration/from_4.5/update_from_4.5.md index ab123f76ae..6ca6ac795e 100644 --- a/docs/update_and_migration/from_4.5/update_from_4.5.md +++ b/docs/update_and_migration/from_4.5/update_from_4.5.md @@ -565,7 +565,7 @@ A command to deal with duplicated database entries, as reported in [IBX-8562](ht ## v4.6.11 -### Ibexa Cloud +### [[= product_name_cloud =]] Update Platform.sh configuration for PHP and Varnish. diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md b/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md index 036294e53d..909ec1f1f5 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md @@ -22,7 +22,8 @@ issues that can occur after migration to [[= product_name =]]. ## Regenerating URL aliases To regenerate URL aliases, use the `ibexa:urls:regenerate-aliases` command. -See [Regenerating URL aliases](url_management.md#regenerating-url-aliases) for more information. + +For more information, see [Regenerating URL aliases](url_management.md#regenerating-url-aliases). !!! note diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md index 831f207988..9deefb8e9c 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md @@ -47,7 +47,7 @@ See Upgrade documentation on how to perform the actual upgrade: [Upgrade (eZ Pub !!! caution "Avoid exception when migrating the database" If you plan to migrate from from eZ Publish through eZ Publish Platform 5.4 to eZ Platform and further, an exception may occur when you try to migrate the database while it contains internal drafts of landing pages. - This can happen because such drafts do not have an expected row in the `ezcontentobject_name` table. + This can happen because such drafts don't have an expected row in the `ezcontentobject_name` table. To avoid this exception, you must remove all internal drafts before you migrate. First, in `content.ini`, set the `InternalDraftsCleanUpLimit` and `InternalDraftsDuration` values to 0. diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index f102abe807..e0142e272f 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -17,7 +17,7 @@ You can then proceed with consecutive upgrades to further versions: v1.13 LTS an !!! caution "Things to be aware of when planning a migration" - 1. While the instructions below are fully supported, we are aware that the community, partners and customers come from a wide range of different versions of eZ Publish, some with issues that do not surface before attempting a migration. That's why we and the community are actively gathering feedback on Slack and/or support channels for Enterprise customers to gradually improve the migration scripts and instructions. Reach out before you start so others who have done this before you can support you. + 1. While the instructions below are fully supported, we are aware that the community, partners and customers come from a wide range of different versions of eZ Publish, some with issues that don't surface before attempting a migration. That's why we and the community are actively gathering feedback on Slack and/or support channels for Enterprise customers to gradually improve the migration scripts and instructions. Reach out before you start so others who have done this before you can support you. 1. As of eZ Platform v1.11, Legacy Bridge is a supported option for 1.x and future 2.x series. This means you can plan for a more gradual migration if you want, just like you could on eZ Publish Platform 5.x, with a more feature-rich version of eZ Platform and (with 2.x) also more recent version of Symfony. This is a great option for those who want the latest features and are comfortable with more frequent releases. @@ -188,12 +188,12 @@ As eZ Publish legacy is installed via composer, we need to take care of placing The easiest way to upgrade the distribution files is to copy the directories that contain site-specific files from the existing 5.4 installation into `//ezpublish_legacy`. Make sure you copy the following directories: - `/ezpublish_legacy/design/` => `/src/legacy_files/design/` - - *Do NOT include built-in designs: admin, base, standard or admin2* + - *Don't include built-in designs: admin, base, standard or admin2* - `/ezpublish_legacy/settings/siteaccess/` => `/src/legacy_files/settings/siteaccess/` - `/ezpublish_legacy/settings/override/*` => `/src/legacy_files/settings/override/*` - Other folders to move over *(or potentially set up symlinks for)* if applicable: - ezpublish_legacy/var/storage/packages - - ezpublish_legacy/extension/\* *(do NOT include the built-in / composer provided ones, like: ezflow, ezjscore, ezoe, ezodf, ezie, ezmultiupload, ezmbpaex, ez_network, ezprestapiprovider, ezscriptmonitor, ezsi, ezfind)* + - ezpublish_legacy/extension/\* *(don't include the built-in / composer provided ones, like: ezflow, ezjscore, ezoe, ezodf, ezie, ezmultiupload, ezmbpaex, ez_network, ezprestapiprovider, ezscriptmonitor, ezsi, ezfind)* - ezpublish_legacy/config.php and ezpublish_legacy/config.cluster.php !!! note @@ -248,7 +248,7 @@ The field types unsupported in eZ Platform are: - [Page](#322-migrate-page-field-to-page-ez-enterprise-only) - Star Rating -For field types which do not have specific procedures below, you must take one of the following actions: +For field types which don't have specific procedures below, you must take one of the following actions: - implement them yourself in eZ Platform - remove them from all content types that use them @@ -273,7 +273,7 @@ Run the conversion script on a copy of your production database as the script is - `--dry-run` prevents the conversion script from writing anything back to the database. It just tests if it's able to convert all the `ezxmltext` documents. - `--export-dir` specifies a directory where it dumps the `ezxmltext` for content object attributes which the conversion script finds problems with - `--export-dir-filter` specifies what severity the problems found needs to be before the script dumps the `ezxmltext`: - - `notice`: `ezxmltext` contains problems which the conversion tool was able to fix automatically and likely do not need manual intervention + - `notice`: `ezxmltext` contains problems which the conversion tool was able to fix automatically and likely don't need manual intervention - `warning`: the conversion tool was able to convert the `ezxmltext` to valid `richtext`, but data could have been altered/removed/added in the process. Manual supervision recommended - `error`: the `ezxmltext` text cannot be converted and manual changes are required. - `--concurrency 4` specifies that the conversion script spawns four child processes which run the conversion. If you have dedicated hardware for running the conversion, you should use concurrency level that matches the number of logical CPUs on your system. If your system needs to do other tasks while running the conversion, you should run with a smaller number. @@ -426,7 +426,9 @@ When the conversion tool detects links with no reference it issues a warning and **``** -The `` tag isn't yet supported in eZ Platform. For more information about this, please have a look at [EZP-29328](https://issues.ibexa.co/browse/EZP-29328) and [EZP-29027](https://issues.ibexa.co/browse/EZP-29027). +The `` tag isn't yet supported in eZ Platform. + +For more information, see [EZP-29328](https://issues.ibexa.co/browse/EZP-29328) and [EZP-29027](https://issues.ibexa.co/browse/EZP-29027). When you're ready to migrate your eZ Publish XmlText content to the eZ Platform RichText format and start using pure eZ Platform setup, start the conversion script without the `--dry-run` option. Execute the following from <new-ez-root>: @@ -462,7 +464,9 @@ Below is a table of the tags that are currently supported, and their correspondi #### 3.2.2 Migrate Page field to Page (eZ Enterprise only) -**If** you use Page field (ezflow) and an eZ Enterprise subscription, and are ready to migrate your eZ Publish Flow content to the eZ Enterprise Page format, you can use a script to migrate your old Page content to new Page, to start using a pure eZ Enterprise setup. See [Migrating legacy Page field (ezflow) to new Page (Enterprise)](#migrating-legacy-page-field-ezflow-to-new-page-enterprise) for more information. +**If** you use Page field (ezflow) and an eZ Enterprise subscription, and are ready to migrate your eZ Publish Flow content to the eZ Enterprise Page format, you can use a script to migrate your old Page content to new Page, to start using a pure eZ Enterprise setup. + +For more information, see [Migrating legacy Page field (ezflow) to new Page (Enterprise)](#migrating-legacy-page-field-ezflow-to-new-page-enterprise). #### 3.2.3 Add other eZ Enterprise schemas (eZ Enterprise only) diff --git a/docs/users/login_methods.md b/docs/users/login_methods.md index 405763221a..5e349e6f98 100644 --- a/docs/users/login_methods.md +++ b/docs/users/login_methods.md @@ -54,4 +54,4 @@ For example, to ensure that user names can only contain lowercase letters, set ` ![Setting a user name pattern](username_pattern.png) To check that all existing user accounts have names that fit the current pattern, run the `ibexa:user:audit-database` command. -It checks all user accounts in the database and lists those that do not fit the pattern. \ No newline at end of file +It checks all user accounts in the database and lists those that don't fit the pattern. \ No newline at end of file diff --git a/docs/users/oauth_client.md b/docs/users/oauth_client.md index 4f9f8f64ff..1f072f5e19 100644 --- a/docs/users/oauth_client.md +++ b/docs/users/oauth_client.md @@ -73,7 +73,7 @@ To use `ResourceOwnerToExistingOrNewUserMapper`, you need to extend it in your c !!! tip "OAuth user content type" When you implement your own mapper for external login, it's good practice to create a special user content type for users registered in this way. - The users who register through an external service do not have a separate password in the system. + The users who register through an external service don't have a separate password in the system. Instead, they log in by their external service's password. To avoid issues with password restrictions in the built-in user content type, create a special content type (for example, "OAuth user"), without restrictions on the password. diff --git a/docs/users/oauth_server.md b/docs/users/oauth_server.md index a3ed42b91d..bb1a482d7c 100644 --- a/docs/users/oauth_server.md +++ b/docs/users/oauth_server.md @@ -49,9 +49,11 @@ return [ ### Keys To configure the server, you need private and public keys. + For more information, see [Generating public and private keys](https://oauth2.thephpleague.com/installation/#generating-public-and-private-keys). You also need an encryption key. + For more information, see [Generating encryption keys](https://oauth2.thephpleague.com/installation/#generating-encryption-keys). Set the following environment variables: diff --git a/docs/users/passwords.md b/docs/users/passwords.md index 1a290245b5..56016808a9 100644 --- a/docs/users/passwords.md +++ b/docs/users/passwords.md @@ -36,7 +36,7 @@ You can use the following additional options with the command: - `--force|-f` - commits the change, otherwise the command only performs a dry run - `--iteration-count|-c` - defines how many users are fetched at once. Lowering this value helps with memory issues -- `--password-ttl|-t` - number of days after which new passwords expire. Used when the command enables password expiration for user content types that do not use it yet. +- `--password-ttl|-t` - number of days after which new passwords expire. Used when the command enables password expiration for user content types that don't use it yet. For example, to revoke the passwords of all users of the `user` content type, run: @@ -113,4 +113,5 @@ It does not check existing passwords, so it won't block login for anyone. It app !!! note The password itself isn't sent to the https://haveibeenpwned.com/ API, which makes this check secure. + For more information on how that is possible, see [Validating Leaked Passwords with k-Anonymity](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/). diff --git a/docs/users/user_authentication.md b/docs/users/user_authentication.md index 99b3694905..9eebe34a38 100644 --- a/docs/users/user_authentication.md +++ b/docs/users/user_authentication.md @@ -69,7 +69,7 @@ services: - { name: kernel.event_subscriber }  ``` -Do not mix `MVCEvents::INTERACTIVE_LOGIN` event (specific to [[= product_name =]]) and `SecurityEvents::INTERACTIVE_LOGIN` event (fired by Symfony security component). +Don't mix `MVCEvents::INTERACTIVE_LOGIN` event (specific to [[= product_name =]]) and `SecurityEvents::INTERACTIVE_LOGIN` event (fired by Symfony security component). ``` php Date: Tue, 15 Oct 2024 15:11:47 +0200 Subject: [PATCH 18/77] More fixes --- .../content_management_api/section_api.md | 2 +- docs/content_management/content_model.md | 2 +- docs/content_management/data_migration/exporting_data.md | 4 ++-- .../field_types/field_type_reference/authorfield.md | 2 +- .../field_types/field_type_reference/dateandtimefield.md | 2 +- .../field_types/field_type_reference/datefield.md | 2 +- .../field_types/field_type_reference/emailaddressfield.md | 2 +- .../field_types/field_type_reference/floatfield.md | 2 +- .../field_types/field_type_reference/imagefield.md | 2 +- .../field_types/field_type_reference/integerfield.md | 2 +- .../field_types/field_type_reference/matrixfield.md | 2 +- .../field_types/field_type_reference/nullfield.md | 2 +- .../field_types/field_type_reference/relationlistfield.md | 2 +- .../field_types/field_type_reference/richtextfield.md | 2 +- .../field_types/field_type_reference/textblockfield.md | 2 +- .../field_types/field_type_reference/timefield.md | 2 +- .../field_types/field_type_reference/urlfield.md | 4 ++-- docs/content_management/field_types/field_type_storage.md | 2 +- docs/content_management/field_types/type_and_value.md | 4 ++-- docs/content_management/images/configure_image_editor.md | 2 +- docs/content_management/images/extend_image_editor.md | 4 ++-- docs/content_management/images/images.md | 2 +- docs/content_management/locations.md | 6 +++--- docs/content_management/url_management/url_management.md | 4 ++-- docs/content_management/workflow/workflow.md | 7 +++---- docs/getting_started/first_steps.md | 4 ++-- docs/getting_started/install_ibexa_dxp.md | 2 +- docs/getting_started/requirements.md | 6 +++--- docs/getting_started/troubleshooting.md | 2 +- .../cache/http_cache/content_aware_cache.md | 8 +++----- .../cache/http_cache/context_aware_cache.md | 8 ++++---- .../cache/http_cache/fastly.md | 2 +- .../cache/http_cache/reverse_proxy.md | 8 ++++---- .../cache/persistence_cache.md | 4 ++-- docs/infrastructure_and_maintenance/logging.md | 2 +- .../security/security_checklist.md | 2 +- docs/multisite/languages/languages.md | 2 +- docs/multisite/set_up_translation_siteaccess.md | 4 ++-- docs/multisite/site_factory/site_factory_configuration.md | 2 +- docs/multisite/siteaccess/siteaccess_matching.md | 4 ++-- docs/permissions/limitation_reference.md | 4 ++-- docs/permissions/permission_overview.md | 4 ++-- docs/permissions/permission_use_cases.md | 8 ++++---- docs/permissions/policies.md | 2 +- docs/personalization/api_reference/tracking_api.md | 6 +++--- docs/personalization/enable_personalization.md | 2 +- docs/personalization/legacy_recommendation_api.md | 2 +- docs/pim/products.md | 4 ++-- docs/release_notes/ez_platform_v1.11.0.md | 4 ++-- docs/release_notes/ez_platform_v2.2.0.md | 2 +- docs/release_notes/ez_platform_v2.5.md | 4 ++-- docs/resources/contributing/package_structure.md | 2 +- docs/search/criteria_reference/languagecode_criterion.md | 2 +- docs/search/criteria_reference/logicalnot_criterion.md | 2 +- docs/search/search_api.md | 6 +++--- .../elastic_search/configure_elastic_search.md | 2 +- docs/search/search_engines/search_engines.md | 2 +- .../search_engines/solr_search_engine/install_solr.md | 6 +++--- .../url_search_reference/logicalnot_url_criterion.md | 2 +- docs/snippets/catalog_permissions_note.md | 2 +- docs/templating/design_engine/add_new_design.md | 2 +- docs/templating/embed_and_list_content/render_images.md | 4 ++-- docs/templating/image_variations.md | 4 ++-- docs/templating/render_content/customize_product_view.md | 2 +- .../twig_function_reference/content_twig_functions.md | 2 +- .../twig_function_reference/field_twig_functions.md | 8 ++++---- .../twig_function_reference/image_twig_functions.md | 2 +- .../beginner_tutorial/3_customize_the_front_page.md | 4 ++-- .../beginner_tutorial/6_improve_configuration.md | 2 +- .../1_implement_the_point2d_value_class.md | 2 +- .../update_and_migration/from_1.x_2.x/update_db_to_2.5.md | 2 +- docs/update_and_migration/from_4.0/to_4.1.md | 6 +++--- .../migrate_to_ibexa_dxp/common_issues.md | 2 +- .../migrate_to_ibexa_dxp/migrating_from_ez_publish.md | 2 +- .../migrating_from_ez_publish_platform.md | 2 +- docs/users/invitations.md | 2 +- docs/users/passwords.md | 2 +- docs/users/user_authentication.md | 2 +- 78 files changed, 123 insertions(+), 126 deletions(-) diff --git a/docs/content_management/content_management_api/section_api.md b/docs/content_management/content_management_api/section_api.md index 3abb9cde5d..b905648601 100644 --- a/docs/content_management/content_management_api/section_api.md +++ b/docs/content_management/content_management_api/section_api.md @@ -49,4 +49,4 @@ You need to provide it with the `ContentInfo` object of the content item, and th [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 64, 67) =]] ``` -Assigning a section to content does not automatically assign it to the content item's children. +Assigning a section to content doesn't automatically assign it to the content item's children. diff --git a/docs/content_management/content_model.md b/docs/content_management/content_model.md index 06e9bb7fce..1cbeb0d696 100644 --- a/docs/content_management/content_model.md +++ b/docs/content_management/content_model.md @@ -66,7 +66,7 @@ Accepts up to 100 characters. Cannot contain non-printable characters and contro It's recommended to either let this value be generated by the Public PHP API as an MD5 hash, or at least to generate it as a hash (e.g. one from SHA family). **`mainLanguageCode`** - the main language code of the content item. -If the `alwaysAvailable` flag is set to true, the content item is shown in this language when the requested language does not exist. +If the `alwaysAvailable` flag is set to true, the content item is shown in this language when the requested language doesn't exist. **`mainLocationId`** - identifier of the content item's main [Location](locations.md). diff --git a/docs/content_management/data_migration/exporting_data.md b/docs/content_management/data_migration/exporting_data.md index b0169e7d13..e54cdc7b60 100644 --- a/docs/content_management/data_migration/exporting_data.md +++ b/docs/content_management/data_migration/exporting_data.md @@ -169,8 +169,8 @@ The mandatory `--mode` option defines the action that importing the file perform The following modes are available: - `create` - creates new items -- `update` - updates an existing item. Only covers specified fields and properties. If the item does not exist, causes an error. -- `delete` - deletes an existing item. If the item does not exist, causes an error. +- `update` - updates an existing item. Only covers specified fields and properties. If the item doesn't exist, causes an error. +- `delete` - deletes an existing item. If the item doesn't exist, causes an error. If you don't provide the `--mode` option, the command asks you to select the mode. diff --git a/docs/content_management/field_types/field_type_reference/authorfield.md b/docs/content_management/field_types/field_type_reference/authorfield.md index 08c49198f1..17403c3b64 100644 --- a/docs/content_management/field_types/field_type_reference/authorfield.md +++ b/docs/content_management/field_types/field_type_reference/authorfield.md @@ -62,7 +62,7 @@ Example: `John Doe john@doe.com` ### Validation -This field type does not perform any special validation of the input value. +This field type doesn't perform any special validation of the input value. ### Settings diff --git a/docs/content_management/field_types/field_type_reference/dateandtimefield.md b/docs/content_management/field_types/field_type_reference/dateandtimefield.md index f8a7c7108b..fe493746bc 100644 --- a/docs/content_management/field_types/field_type_reference/dateandtimefield.md +++ b/docs/content_management/field_types/field_type_reference/dateandtimefield.md @@ -68,7 +68,7 @@ $hash = [ ### Validation -This field type does not perform any special validation of the input value. +This field type doesn't perform any special validation of the input value. ### Settings diff --git a/docs/content_management/field_types/field_type_reference/datefield.md b/docs/content_management/field_types/field_type_reference/datefield.md index 982b29d40e..30bf32ab5e 100644 --- a/docs/content_management/field_types/field_type_reference/datefield.md +++ b/docs/content_management/field_types/field_type_reference/datefield.md @@ -70,7 +70,7 @@ $hash = [ ### Validation -This field type does not perform any special validation of the input value. +This field type doesn't perform any special validation of the input value. ### Settings diff --git a/docs/content_management/field_types/field_type_reference/emailaddressfield.md b/docs/content_management/field_types/field_type_reference/emailaddressfield.md index 3f013b87d0..4554ee5975 100644 --- a/docs/content_management/field_types/field_type_reference/emailaddressfield.md +++ b/docs/content_management/field_types/field_type_reference/emailaddressfield.md @@ -62,4 +62,4 @@ If the validations fail, a `ValidationError` is thrown, specifying the error m ### Settings -This field type does not support settings. +This field type doesn't support settings. diff --git a/docs/content_management/field_types/field_type_reference/floatfield.md b/docs/content_management/field_types/field_type_reference/floatfield.md index 38a6971f45..8bc9378a0a 100644 --- a/docs/content_management/field_types/field_type_reference/floatfield.md +++ b/docs/content_management/field_types/field_type_reference/floatfield.md @@ -79,4 +79,4 @@ $floatFieldCreateStruct->validatorConfiguration = [ ### Settings -This field type does not support settings. +This field type doesn't support settings. diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index f87c690ab5..b8b386e7cb 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -36,7 +36,7 @@ The `value` property of an Image field returns an `Ibexa\Core\FieldType\Image\V ### Settings -This field type does not support settings. +This field type doesn't support settings. ### Image Variations diff --git a/docs/content_management/field_types/field_type_reference/integerfield.md b/docs/content_management/field_types/field_type_reference/integerfield.md index 0eed6f2712..4e59346f36 100644 --- a/docs/content_management/field_types/field_type_reference/integerfield.md +++ b/docs/content_management/field_types/field_type_reference/integerfield.md @@ -72,4 +72,4 @@ $validatorConfiguration = [ ### Settings -This field type does not support settings. +This field type doesn't support settings. diff --git a/docs/content_management/field_types/field_type_reference/matrixfield.md b/docs/content_management/field_types/field_type_reference/matrixfield.md index 4f57166d65..691e800096 100644 --- a/docs/content_management/field_types/field_type_reference/matrixfield.md +++ b/docs/content_management/field_types/field_type_reference/matrixfield.md @@ -41,7 +41,7 @@ The minimum number of rows is set on content type level for each field. Validation checks for empty rows. A row is considered empty if it contains only empty cells (or cells containing only spaces). Empty rows are removed. -If, after removing empty rows, the number of rows does not fulfill the configured `Minimum number of rows`, the field doesn't validate. +If, after removing empty rows, the number of rows doesn't fulfill the configured `Minimum number of rows`, the field doesn't validate. For example, the following input doesn't validate if `Minimum number of rows` is set to 3, because the second row is empty: diff --git a/docs/content_management/field_types/field_type_reference/nullfield.md b/docs/content_management/field_types/field_type_reference/nullfield.md index 51f1424262..b3d3b6521c 100644 --- a/docs/content_management/field_types/field_type_reference/nullfield.md +++ b/docs/content_management/field_types/field_type_reference/nullfield.md @@ -15,7 +15,7 @@ Null field type accepts anything provided as a value and is usually combined wit - NullConverter: Makes it not store anything to the legacy storage engine (database), nor it reads any data. - Unindexed: Indexable class making sure nothing is indexed to configured search engine. -This field type does not have its own fixed internal name. Its identifier is instead configured as needed by passing it as an argument to the constructor. +This field type doesn't have its own fixed internal name. Its identifier is instead configured as needed by passing it as an argument to the constructor. ### Example for usage of Null field type diff --git a/docs/content_management/field_types/field_type_reference/relationlistfield.md b/docs/content_management/field_types/field_type_reference/relationlistfield.md index 6bf2fe0943..c9f0948e38 100644 --- a/docs/content_management/field_types/field_type_reference/relationlistfield.md +++ b/docs/content_management/field_types/field_type_reference/relationlistfield.md @@ -57,7 +57,7 @@ $relationListValue = new RelationList\Value( This field type validates if: -- the `selectionMethod` specified is `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_BROWSE` or `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_DROPDOWN`. A validation error is thrown if the value does not match. +- the `selectionMethod` specified is `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_BROWSE` or `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_DROPDOWN`. A validation error is thrown if the value doesn't match. - the `selectionDefaultLocation` specified is `null`, `string` or `integer`. If the type validation fails a validation error is thrown. - the value specified in `selectionContentTypes` is an `array`. If not, a validation error in given. - the number of content items selected in the field isn't greater than the `selectionLimit`. diff --git a/docs/content_management/field_types/field_type_reference/richtextfield.md b/docs/content_management/field_types/field_type_reference/richtextfield.md index 7ea222dd52..24fa3c86d6 100644 --- a/docs/content_management/field_types/field_type_reference/richtextfield.md +++ b/docs/content_management/field_types/field_type_reference/richtextfield.md @@ -30,7 +30,7 @@ This field type validates and stores structured rich text, and exposes it in sev The field type expects an XML value as input, in the form of a string, `DOMDocument` object, or field type's `Value` object. The field type's `Value` object must hold the value in the field type's [internal format](#internal-format). -For a string of a `DOMDocument` object, if the input does not conform to this format, it's converted into it. +For a string of a `DOMDocument` object, if the input doesn't conform to this format, it's converted into it. ##### Internal format diff --git a/docs/content_management/field_types/field_type_reference/textblockfield.md b/docs/content_management/field_types/field_type_reference/textblockfield.md index 478f8f6a11..7cfdf43ceb 100644 --- a/docs/content_management/field_types/field_type_reference/textblockfield.md +++ b/docs/content_management/field_types/field_type_reference/textblockfield.md @@ -34,7 +34,7 @@ The constructor for this Value object initializes a new Value object with the va ### Validation -This field type does not perform any special validation of the input value. +This field type doesn't perform any special validation of the input value. ### Settings diff --git a/docs/content_management/field_types/field_type_reference/timefield.md b/docs/content_management/field_types/field_type_reference/timefield.md index 3ee3a86c38..f3f829abb7 100644 --- a/docs/content_management/field_types/field_type_reference/timefield.md +++ b/docs/content_management/field_types/field_type_reference/timefield.md @@ -58,7 +58,7 @@ Example: `36000` ### Validation -This field type does not perform validation of the input value. +This field type doesn't perform validation of the input value. ### Settings diff --git a/docs/content_management/field_types/field_type_reference/urlfield.md b/docs/content_management/field_types/field_type_reference/urlfield.md index 133272c47a..ff887f83c7 100644 --- a/docs/content_management/field_types/field_type_reference/urlfield.md +++ b/docs/content_management/field_types/field_type_reference/urlfield.md @@ -61,8 +61,8 @@ $hash = [ ### Validation -This field type does not perform validation. +This field type doesn't perform validation. ### Settings -This field type does not have settings. +This field type doesn't have settings. diff --git a/docs/content_management/field_types/field_type_storage.md b/docs/content_management/field_types/field_type_storage.md index 73da67dac2..1b64fb928b 100644 --- a/docs/content_management/field_types/field_type_storage.md +++ b/docs/content_management/field_types/field_type_storage.md @@ -122,7 +122,7 @@ The interface `Ibexa\Contracts\Core\FieldType\StorageGateway` is implemented by |------|-----------| |`setConnection()`|The registry mechanism uses this method to set the SPI storage connection (e.g. the database connection to the Legacy Storage database) into the gateway, which might be used to store external data. The connection is retrieved from the `$context` array automatically by the registry.| -The Gateway implementation itself must take care of validating that it received a usable connection. If it does not, it should throw a `RuntimeException`. +The Gateway implementation itself must take care of validating that it received a usable connection. If it doesn't, it should throw a `RuntimeException`. The registry mechanism is realized as a base class for `FieldStorage` implementations: `Ibexa\Core\FieldType\GatewayBasedStorage`. For managing `StorageGateway`s, the following methods are already implemented in the base class: diff --git a/docs/content_management/field_types/type_and_value.md b/docs/content_management/field_types/type_and_value.md index cd00b660e4..4088902372 100644 --- a/docs/content_management/field_types/type_and_value.md +++ b/docs/content_management/field_types/type_and_value.md @@ -37,7 +37,7 @@ This method retrieves via public PHP API a schema for the field type settings. A #### `getValidatorConfigurationSchema()` -In addition to normal settings, the field type should provide schema settings for its validation process. The schema describes what kind of validation can be performed by the field type and which settings the user can specify to these validation methods. For example, the `ezstring` type can validate minimum and maximum length of the string. It therefore provides a schema to indicate to the user that they might specify the corresponding restrictions, when creating a `FieldDefinition` with this type. The schema does not underlie any regulations, except for that it must be serializable. +In addition to normal settings, the field type should provide schema settings for its validation process. The schema describes what kind of validation can be performed by the field type and which settings the user can specify to these validation methods. For example, the `ezstring` type can validate minimum and maximum length of the string. It therefore provides a schema to indicate to the user that they might specify the corresponding restrictions, when creating a `FieldDefinition` with this type. The schema doesn't underlie any regulations, except for that it must be serializable. #### `validateFieldSettings()` @@ -72,7 +72,7 @@ For example: a user provides an HTTP link as a string, `acceptValue()` converts !!! note - `acceptValue()` asserts structural consistency of the value, but does not validate plausibility of the value. + `acceptValue()` asserts structural consistency of the value, but doesn't validate plausibility of the value. #### `getEmptyValue()` diff --git a/docs/content_management/images/configure_image_editor.md b/docs/content_management/images/configure_image_editor.md index 354a0fb771..22930ab734 100644 --- a/docs/content_management/images/configure_image_editor.md +++ b/docs/content_management/images/configure_image_editor.md @@ -10,7 +10,7 @@ For more information, see [User Documentation]([[= user_doc =]]/editing_images/) !!! note - The Image Editor does not support images that come from a Digital Asset Management (DAM) system. + The Image Editor doesn't support images that come from a Digital Asset Management (DAM) system. !!! note diff --git a/docs/content_management/images/extend_image_editor.md b/docs/content_management/images/extend_image_editor.md index 5b39e59f9e..3c780f3dd9 100644 --- a/docs/content_management/images/extend_image_editor.md +++ b/docs/content_management/images/extend_image_editor.md @@ -19,7 +19,7 @@ In `assets/random_dot/`, create the `random-dot.js` file with the following code [[= include_file('code_samples/back_office/image_editor/assets/random_dot/random-dot-stem.js') =]] ``` -The code does not perform any action yet, you add the action in the following steps. +The code doesn't perform any action yet, you add the action in the following steps. ## Add configuration @@ -46,7 +46,7 @@ At this point you should be able to see a new button in the Image Editor's UI. ## Expand the React component -The button that you created above does not initiate any action yet. +The button that you created above doesn't initiate any action yet. You must modify the JavaScript component to add a function to the button. ### Contexts diff --git a/docs/content_management/images/images.md b/docs/content_management/images/images.md index 4567e63dc1..c427c6e33e 100644 --- a/docs/content_management/images/images.md +++ b/docs/content_management/images/images.md @@ -62,7 +62,7 @@ For more information, see the [bundle's documentation](https://symfony.com/bundl !!! caution "Code injection in image EXIF" EXIF metadata of an image may contain for example, HTML, JavaScript, or PHP code.  - [[= product_name =]] is itself does not parse EXIF metadata, but third-party bundles must be secured against this eventuality. + [[= product_name =]] is itself doesn't parse EXIF metadata, but third-party bundles must be secured against this eventuality. Images must be treated like any other user-submitted data - make sure that metadata is properly escaped before use. ### Image URL resolution diff --git a/docs/content_management/locations.md b/docs/content_management/locations.md index 4b32cfeebf..c22e7a54bd 100644 --- a/docs/content_management/locations.md +++ b/docs/content_management/locations.md @@ -12,7 +12,7 @@ Every published content item has a Location and, as a consequence, also a place ![Content tree - locations](content_management_tree_locations.png "Content tree - locations") A content item receives a Location only once it has been published. -This means that a new unpublished draft does not have a Location yet. +This means that a new unpublished draft doesn't have a Location yet. You can find drats in the **Drafts** tab in the **Content** menu. ![Drafts](content_management_drafts.png "Drafts") @@ -125,9 +125,9 @@ it's unavailable on the front page. The difference is that a Location Hidden by superior cannot be revealed separately from their parent(s). It only becomes visible once all of its parent Locations are made visible again. -A Hidden by superior status does not override a Hidden status. +A Hidden by superior status doesn't override a Hidden status. This means that if a Location is Hidden manually and later one of its ancestors is hidden as well, -the first Location's status does not change – it remains Hidden (not Hidden by superior). +the first Location's status doesn't change – it remains Hidden (not Hidden by superior). If the ancestor Location is made visible again, the first Location still remains hidden. The way visibility works can be illustrated using the following scenarios: diff --git a/docs/content_management/url_management/url_management.md b/docs/content_management/url_management/url_management.md index d55a523a8b..bd46311251 100644 --- a/docs/content_management/url_management/url_management.md +++ b/docs/content_management/url_management/url_management.md @@ -146,7 +146,7 @@ For each URL alias definition the history of changes is preserved, so that users !!! caution "Legacy storage engine limitation" - The [Legacy storage engine](field_type_storage.md#legacy-storage-engine) does not archive URL aliases, which initially had the same name in multiple languages. + The [Legacy storage engine](field_type_storage.md#legacy-storage-engine) doesn't archive URL aliases, which initially had the same name in multiple languages. For more information, see [the Jira ticket](https://issues.ibexa.co/browse/EZP-31818). URL aliases aren't SiteAccess-aware. When creating an alias, you can select a SiteAccess to base it on. @@ -196,7 +196,7 @@ Use it when: - you change URL alias configuration and want to regenerate old aliases - you encounter database corruption -- you have content that does not have a URL alias +- you have content that doesn't have a URL alias !!! caution diff --git a/docs/content_management/workflow/workflow.md b/docs/content_management/workflow/workflow.md index c5555f6a83..c61b953de2 100644 --- a/docs/content_management/workflow/workflow.md +++ b/docs/content_management/workflow/workflow.md @@ -45,7 +45,7 @@ If set to `published`, applies for Content that has already been published (for Each stage in the workflow has an identifier and can have a label and a color. -The optional `last_stage` key indicates that content in this stage does not appear on the dashboard or in Review Queue. +The optional `last_stage` key indicates that content in this stage doesn't appear on the dashboard or in Review Queue. One stage, listed under `initial_stage`, is the one that the workflow starts with. @@ -113,8 +113,7 @@ To do so, configure the `publish` action for the transition: ### Disable Quick Review -You can disable the default workflow, for example, if your project does not use -workflows, or Quick Review entries clog your database: +You can disable the default workflow, for example, if your project doesn't use workflows, or Quick Review entries clog your database: ``` yaml [[= include_file('code_samples/workflow/custom_workflow/config/packages/workflows.yaml', 0, 4) =]][[= include_file('code_samples/workflow/custom_workflow/config/packages/workflows.yaml', 63, 67) =]] @@ -171,7 +170,7 @@ For example, you can use it to only allow a legal team to edit content in the `l ### Validate form before workflow transition -By default, sending content to the next stage of the workflow does not validate the form in UI, +By default, sending content to the next stage of the workflow doesn't validate the form in UI, so with the publish action, the form isn't verified for errors in UI. However, during the publish action, the sent form is validated in the service. diff --git a/docs/getting_started/first_steps.md b/docs/getting_started/first_steps.md index dceb94d924..7c7627a59f 100644 --- a/docs/getting_started/first_steps.md +++ b/docs/getting_started/first_steps.md @@ -128,10 +128,10 @@ The SiteAccess is automatically matched using the last part of the URI. !!! note "Log in" At this point you need to log in to preview the new SiteAccess, - because an anonymous visitor does not have permissions to view it. + because an anonymous visitor doesn't have permissions to view it. See [section about permissions below](#set-up-permissions). -For now the new SiteAccess does not differ from the main site. +For now the new SiteAccess doesn't differ from the main site. For more information, see [Multisite](multisite.md) and [SiteAccess matchers](siteaccess_matching.md#available-siteaccess-matchers). diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md index 507123f870..bdcf288daf 100644 --- a/docs/getting_started/install_ibexa_dxp.md +++ b/docs/getting_started/install_ibexa_dxp.md @@ -227,7 +227,7 @@ and for creating signed URIs when using [ESI (Edge Side Includes)]([[= symfony_d php -r "print bin2hex(random_bytes(32));" ``` - Don't commit the secret to version control systems, or share it with anyone who does not strictly need it. + Don't commit the secret to version control systems, or share it with anyone who doesn't strictly need it. If you have any suspicion that the secret may have been exposed, replace it with a new one. The same goes for other secrets, like database password, Varnish invalidate token, JWT passphrase, etc. diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index addc377f6f..a2918a7623 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -380,7 +380,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, !!! note - As Platform.sh does not support a configuration with multiple PostgreSQL databases, + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. ### Recommended [[= product_name_cloud =]] setup @@ -427,7 +427,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, !!! note - As Platform.sh does not support a configuration with multiple PostgreSQL databases, + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. ### Recommended [[= product_name_cloud =]] setup @@ -503,7 +503,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, !!! note - As Platform.sh does not support a configuration with multiple PostgreSQL databases, + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for eZ Platform Cloud / Platform.sh it's impossible to have a DFS table in a separate database. ### Custom integrations diff --git a/docs/getting_started/troubleshooting.md b/docs/getting_started/troubleshooting.md index 4aec5a8a1f..6e5f4b5277 100644 --- a/docs/getting_started/troubleshooting.md +++ b/docs/getting_started/troubleshooting.md @@ -84,7 +84,7 @@ This means there is a known security bug in the specific version of the package, In most cases this means that a fix is available in a newer version. If you increase your requirement to that version, the conflict is resolved. -In the rare case when there is no fixed version, you can revert your requirement to an older version which does not have the bug. +In the rare case when there is no fixed version, you can revert your requirement to an older version which doesn't have the bug. If you have to use the version with the bug (not recommended) you can use `composer remove roave/security-advisories`. In such case, require it again when the bug is fixed and the package is updated: `composer require roave/security-advisories:dev-master`  diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index 6ea9ddbc7e..b73f3ff0e8 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -373,7 +373,7 @@ This section describes to how to debug problems related to HTTP cache. If you perform tests on Fastly enabled environment on [[= product_name_cloud =]] provided by Platform.sh, you need to use the Platform.sh dashboard to obtain the endpoint for Nginx. -The following example shows how to debug and check why Fastly does not cache the front page properly. +The following example shows how to debug and check why Fastly doesn't cache the front page properly. If you run the command multiple times: `curl -IXGET https://www.staging.foobar.com.us-2.platformsh.site` @@ -583,10 +583,8 @@ X-Cache-Debug: 1 Surrogate-Key: ez-all ``` -The `Cache-Control` and `Vary` headers look correct. The request is handled by a custom controller and the `Surrogate-Key` only contains the default `ez-all` value. -This isn't a problem as long as the controller -does not return values from any Content in the [[= product_name =]] repository. If it does, the controller should also add -the corresponding IDs to such objects in that header. +The `Cache-Control` and `Vary` headers look correct. The request is handled by a custom controller and the `Surrogate-Key` only contains the default `ez-all` value. +This isn't a problem as long as the controller doesn't return values from any Content in the [[= product_name =]] repository. If it does, the controller should also add the corresponding IDs to such objects in that header. The `Set-Cookie` here may cause the problem. A ESI fragment should never set a cookie because: - Clients only receive the headers set in the "mother" document (the headers in the "/" response in this case). diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md index 431d754369..90c286b8a8 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md @@ -27,7 +27,7 @@ This expands steps covered in [FOSHttpCacheBundle documentation on user context 1. The caching proxy receives the hash response, copies the hash header to the client's original request for `/foo` and restarts the modified original request. 1. If the response to `/foo` should differ per user context, the application sets a `Vary: X-Context-User-Hash` header, which makes Proxy store the variations of this cache varying on the hash value. -The next time a request comes in from the same user, application lookup for the hash (step 3) does not take place, +The next time a request comes in from the same user, application lookup for the hash (step 3) doesn't take place, as the hash lookup itself is cached by the cache proxy as described below. ### User context hash caching @@ -60,8 +60,8 @@ It also varies on `Authorization` to cover any possible basic authorization head the default SiteAccess on the domain needs to point to the same repository (database), because `/_fos_user_context_hash` isn't SiteAccess-aware by default (see `ibexa.rest.default_router.non_siteaccess_aware_routes` parameter). - This occurs because reverse proxy does not have knowledge about SiteAccesses - and it does not pass the whole URL to be able to cache the user context hash response. + This occurs because reverse proxy doesn't have knowledge about SiteAccesses + and it doesn't pass the whole URL to be able to cache the user context hash response. The only known workaround is to make it SiteAccess aware, and have custom VCL logic tied to your SiteAccess matching with Varnish/Fastly, to send the SiteAccess prefix as URI. @@ -109,7 +109,7 @@ Example: 2\. Ajax/JS lookup to "uncached" custom Symfony controllers: -This method does not consume memory in Varnish. +This method doesn't consume memory in Varnish. It can optionally be cached with custom logic: Symfony Cache on server side and/or with client side caching techniques. This should be done as Ajax/JS lookup to avoid the uncached request that slows down the whole delivery of Vanish if it's done as ESI. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md index b08114a87f..fbd1bcd7c1 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md @@ -304,7 +304,7 @@ fastly service-version activate --version=latest ### Get diff between two versions You can easily view the diff between two different versions by using the Fastly web interface. -Unfortunately, Fastly CLI does not support this functionality. +Unfortunately, Fastly CLI doesn't support this functionality. However, Fastly API and GNU diff can help you get an identical result. Use the Fastly API to download the generated `.vcl` file. It includes the VCL configuration that Fastly generates diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md index e0d3df381f..59fa7cb26a 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md @@ -40,7 +40,7 @@ Using a different proxy is highly recommended as they provide better performance !!! note - Use of Varnish or Fastly is a requirement for a [Clustering](clustering.md) setup, as Symfony Proxy does not support sharing cache between several application servers. + Use of Varnish or Fastly is a requirement for a [Clustering](clustering.md) setup, as Symfony Proxy doesn't support sharing cache between several application servers. ## VCL base files @@ -88,7 +88,7 @@ framework: !!! caution "Careful when trusting dynamic IP using `REMOTE_ADDR` value or similar" - On Platform.sh, Varnish does not have a static IP, like with [AWS LB](https://symfony.com/doc/5.1/deployment/proxies.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly). + On Platform.sh, Varnish doesn't have a static IP, like with [AWS LB](https://symfony.com/doc/5.1/deployment/proxies.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly). For this reason, the `TRUSTED_PROXIES` env variable supports being set to value `REMOTE_ADDR`, which is equal to: ```php @@ -153,7 +153,7 @@ ibexa: If your installation uses Varnish and you want users to be able to configure and use Captcha in their forms, you must enable sending Captcha data as a response to an Ajax request. -Otherwise, Varnish does not allow for the transfer of Captcha data to the form, and as a result, users see an empty image. +Otherwise, Varnish doesn't allow for the transfer of Captcha data to the form, and as a result, users see an empty image. To enable sending Captcha over Ajax, add the following configuration: @@ -306,7 +306,7 @@ fastcgi_param FASTLY_KEY "token" Stale cache, or grace mode in Varnish, occurs when: - Cache is served some time after the TTL expired. -- When the back-end server does not respond. +- When the back-end server doesn't respond. This has several benefits for high traffic installations to reduce load to the back end. Instead of creating several concurrent requests for the same page to the back end, diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 73e7a66843..28e7cefd48 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -183,7 +183,7 @@ See `.env`, `config/packages/ibexa.yaml` and `config/packages/cache_pool/cache.r !!! caution "Clearing Redis cache" - The regular `php bin/console cache:clear` command does not clear Redis persistence cache. + The regular `php bin/console cache:clear` command doesn't clear Redis persistence cache. Use a dedicated Symfony command to clear the pool you have configured: `php bin/console cache:pool:clear cache.redis`. ##### Redis Clustering @@ -259,7 +259,7 @@ See `config/default_parameters.yaml` and `config/cache_pool/cache.memcached.yaml !!! caution "Clearing Memcached cache" - The regular `php bin/console cache:clear` command does not clear Memcached persistence cache. + The regular `php bin/console cache:clear` command doesn't clear Memcached persistence cache. Use a dedicated Symfony command to clear the pool you have configured: `php bin/console cache:pool:clear cache.memcached`. diff --git a/docs/infrastructure_and_maintenance/logging.md b/docs/infrastructure_and_maintenance/logging.md index 78623f065d..d028c27a5c 100644 --- a/docs/infrastructure_and_maintenance/logging.md +++ b/docs/infrastructure_and_maintenance/logging.md @@ -8,7 +8,7 @@ description: Ensure that your logs are secure and GDPR compliant by clearing the Some logs can contain personal information such as User ID or password. -By default, [[= product_name =]] does not log User IDs. +By default, [[= product_name =]] doesn't log User IDs. You can change this behavior by modifying the following setting: ``` yaml diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index 6b9f0eb604..21d1f8a7b1 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -109,7 +109,7 @@ When using the "forgot password" feature, a token is created which expires if th link that gets mailed to them in time. The time before it expires is set in the parameter `ibexa.site_access.config.default.security.token_interval_spec`. By nature this feature must be available to users before they have logged in, including would-be attackers. If an attacker uses this feature with someone else's email -address, the attacker does not receive the email. But they could still try to guess the password reset link. That's why +address, the attacker doesn't receive the email. But they could still try to guess the password reset link. That's why this interval should be as short as possible. 5 minutes is often enough. [[= product_name =]] allows you to create and send invitations to create an account in the frontend as a customer, the back office diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index 1377b1d753..cb89b0d261 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -32,7 +32,7 @@ yarn encore Language versions consist of translated values of the content item's fields. In the content type definition every field is set to be Translatable or not. -[[= product_name =]] does not decide by itself which fields can be translated and which cannot. For some field values the need for a translation can be obvious, for example for the body of an article. In other cases, for instance images without text, integer numbers or e-mail addresses, translation is usually unnecessary. Despite that, [[= product_name =]] gives you the possibility to mark any field as translatable regardless of its field type. It's only your decision to exclude the translation possibility for those fields where it makes no sense. +[[= product_name =]] doesn't decide by itself which fields can be translated and which cannot. For some field values the need for a translation can be obvious, for example for the body of an article. In other cases, for instance images without text, integer numbers or e-mail addresses, translation is usually unnecessary. Despite that, [[= product_name =]] gives you the possibility to mark any field as translatable regardless of its field type. It's only your decision to exclude the translation possibility for those fields where it makes no sense. When a field isn't flagged as Translatable, its value is copied from the initial/main translation when a new language version is created. This copied value cannot be modified. When a field is Translatable, you have to enter its value in a new language version manually. diff --git a/docs/multisite/set_up_translation_siteaccess.md b/docs/multisite/set_up_translation_siteaccess.md index 6018853e28..e4a4931c72 100644 --- a/docs/multisite/set_up_translation_siteaccess.md +++ b/docs/multisite/set_up_translation_siteaccess.md @@ -64,13 +64,13 @@ ibexa: ``` With this configuration, the main English site displays content in English and ignores French content. -The French site displays content in French, but also in English, if it does not exist in French. +The French site displays content in French, but also in English, if it doesn't exist in French. Clear the cache by running: `php bin/console cache:clear`. ## Set permissions -By default, the Anonymous user role does not have permissions for new SiteAccesses. +By default, the Anonymous user role doesn't have permissions for new SiteAccesses. As a next step, allow Anonymous users to read content on the new SiteAccesses: 1. In the back office, go to **Admin** -> **Roles**. diff --git a/docs/multisite/site_factory/site_factory_configuration.md b/docs/multisite/site_factory/site_factory_configuration.md index 0dadf77586..f87834c227 100644 --- a/docs/multisite/site_factory/site_factory_configuration.md +++ b/docs/multisite/site_factory/site_factory_configuration.md @@ -46,7 +46,7 @@ After that, you cannot copy the Site skeleton again, for example in the edit vie You can create as many skeletons as you need and assign them to templates. Remember that one template can only have one Site skeleton. -If the design does not have a defined Site skeleton, a directory of the new site is created in a standard Site Factory process. +If the design doesn't have a defined Site skeleton, a directory of the new site is created in a standard Site Factory process. To define a Site skeleton, add the `site_skeleton_id` or `site_skeleton_remote_id` key to the site template definition. This can be either a Location ID (e.g. `5966`), or a remote Location ID (e.g. `3bed95afb1f8126f06a3c464e461e1ae66`). diff --git a/docs/multisite/siteaccess/siteaccess_matching.md b/docs/multisite/siteaccess/siteaccess_matching.md index cee515cb6b..9233ba2f9f 100644 --- a/docs/multisite/siteaccess/siteaccess_matching.md +++ b/docs/multisite/siteaccess/siteaccess_matching.md @@ -43,7 +43,7 @@ ibexa: my.site: mysite ``` -If the matcher class does not start with a backslash (`\`), it's relative to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher` +If the matcher class doesn't start with a backslash (`\`), it's relative to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher` (for example, `Map\URI` refers to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI`) You can specify [custom matchers](#custom-matchers) by using a fully qualified class name (e.g. `\My\SiteAccess\Matcher`) @@ -190,7 +190,7 @@ Example URL `http://my_site.com:8080/content` matches SiteAccess `site`. ### `Ibexa\SiteFactory\SiteAccessMatcher` [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] Enables the use of [Site Factory](site_factory.md). -Does not take any parameters in configuration: +Doesn't take any parameters in configuration: ``` yaml ibexa: diff --git a/docs/permissions/limitation_reference.md b/docs/permissions/limitation_reference.md index 36aec10ae9..7f1a1718a9 100644 --- a/docs/permissions/limitation_reference.md +++ b/docs/permissions/limitation_reference.md @@ -11,14 +11,14 @@ A generic limitation type to use when no other limitation has been implemented. Without any Limitation assigned, a `LimitationNotFoundException` is thrown. It's called "blocking" because it always informs the permissions system that -the user does not have access to any policy the limitation is assigned to, making +the user doesn't have access to any policy the limitation is assigned to, making the permissions system move on to the next policy. ### Possible values |Value|UI value|Description| |------|------|------| -|``|``|This is a generic limitation which does not validate the values provided to it. Make sure that you validate the values passed to this limitation in your own logic.| +|``|``|This is a generic limitation which doesn't validate the values provided to it. Make sure that you validate the values passed to this limitation in your own logic.| ### Configuration diff --git a/docs/permissions/permission_overview.md b/docs/permissions/permission_overview.md index 6c7693a697..8eb4eb0902 100644 --- a/docs/permissions/permission_overview.md +++ b/docs/permissions/permission_overview.md @@ -4,7 +4,7 @@ description: The permission system is based on policies that you assign to users # Permission overview -A new user does not have permissions for any part of the system, unless they're explicitly given access. +A new user doesn't have permissions for any part of the system, unless they're explicitly given access. To get access they need to inherit roles, typically assigned to the user group they belong to. Each role can contain one or more **Policies**. A policy is a rule that gives access to a single **function** in a **module**. @@ -34,7 +34,7 @@ The more role assignments and complex policies you add for a given user, the mor You can control access to a custom controller by implementing the `performAccessCheck()` method. -In the following example the user does not have access to the controller unless they have the `section/view` policy: +In the following example the user doesn't have access to the controller unless they have the `section/view` policy: ``` php use Ibexa\Core\MVC\Symfony\Security\Authorization\Attribute; diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index 44f1072da4..3db1d2d3df 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -29,7 +29,7 @@ To publish, they must send the content for review to another User with proper pe - `content/edit` Use this setup with [[= product_name_exp =]] or [[= product_name_com =]] only, -as [[= product_name_headless =]] does not allow the User to continue working with their content. +as [[= product_name_headless =]] doesn't allow the User to continue working with their content. ## Create and publish content @@ -61,7 +61,7 @@ Further manipulation of Trash requires the `content/restore` policy to restore i !!! caution With the `content/cleantrash` policy, the User can empty the Trash even if they don't have access to the trashed content, - for example, because it belonged to a Section that the User does not have permissions for. + for example, because it belonged to a Section that the user doesn't have permissions for. ## Restrict editing to part of the tree @@ -74,7 +74,7 @@ Let's assume you have two Folders under your Home: Blog and Articles. You can let a User create content for the blogs, but not in Articles, by adding a `Section` limitation to the Blog content item. This allows the User to publish content anywhere under this Location in the structure. -Section does not have to belong to the same Subtree of Location in the content structure, any Locations can be assigned to it. +Section doesn't have to belong to the same Subtree of Location in the content structure, any Locations can be assigned to it. ### Location limitation @@ -112,7 +112,7 @@ The vegetarian editors should now see the following content tree: ![Limited subtree file structure](subtree_usability_notes_2.png) -When a policy has more than one limitation, all of them have to apply, or the policy does not work. +When a policy has more than one limitation, all of them have to apply, or the policy doesn't work. For example, a `Location` limitation on Location `1/2` and `Subtree of Location` limitation on `1/2/55` cannot work together, because no Location can satisfy both those requirements at the same time. To combine more than one limitation with the *or* relation, not *and*, diff --git a/docs/permissions/policies.md b/docs/permissions/policies.md index 40602e556b..1071ba60e3 100644 --- a/docs/permissions/policies.md +++ b/docs/permissions/policies.md @@ -185,7 +185,7 @@ which define, which parts of the application or website the user has access to. | Module | Function | Effect | Possible limitations | |------------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `content` | `cleantrash` | empty the Trash (even when the User does not have access to individual content items) | +| `content` | `cleantrash` | empty the Trash (even when the User doesn't have access to individual content items) | | | `create` | create new content. Note: even without this Policy the User is able to enter edit mode, but cannot finalize work with the content item. | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation)
[Owner of Parent](limitation_reference.md#owner-of-parent-limitation)
[Content type Group of Parent](limitation_reference.md#content-type-group-of-parent-limitation)
[Content type of Parent](limitation_reference.md#content-type-of-parent-limitation)
[Parent Depth](limitation_reference.md#parent-depth-limitation)
[Field Group](limitation_reference.md#field-group-limitation)
[Change Owner](limitation_reference.md#change-owner-limitation) | | | `diff` | unused | | | `edit` | edit existing content | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Owner](limitation_reference.md#owner-limitation)
[Content type Group](limitation_reference.md#content-type-group-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation)
[Object State](limitation_reference.md#object-state-limitation)
[Workflow Stage](limitation_reference.md#workflow-stage-limitation)
[Field Group](limitation_reference.md#field-group-limitation)
[Version Lock](limitation_reference.md#version-lock-limitation)
[Change Owner](limitation_reference.md#change-owner-limitation) | diff --git a/docs/personalization/api_reference/tracking_api.md b/docs/personalization/api_reference/tracking_api.md index a97612ebb5..d00c4a90af 100644 --- a/docs/personalization/api_reference/tracking_api.md +++ b/docs/personalization/api_reference/tracking_api.md @@ -123,16 +123,16 @@ as item identifiers and recommendable items. End users who browse through the shop probably get recommendations of the same item that is currently displayed but in a different size and/or color, a so-called "variant". -The Personalization server does not recognize relations between items, therefore, +The Personalization server doesn't recognize relations between items, therefore, every single SKU is used to calculate similarities between them. In the case of bestsellers, this could lead to the appearance of a shirt in size L on position 2 and the same shirt in size M on position 4. Customer B decides to use the UPC as item identifiers. This results in recommendations that don't contain variations of the currently shown item. -Therefore, the detail page of shirt X does not contain a recommendation +Therefore, the detail page of shirt X doesn't contain a recommendation for the same shirt in a different size. -And the same shirt does not show up twice on a list of bestseller recommendations. +And the same shirt doesn't show up twice on a list of bestseller recommendations. If the size of an item or the color is selectable on a detail page of an item, you may prefer to use the UPC. diff --git a/docs/personalization/enable_personalization.md b/docs/personalization/enable_personalization.md index 30f948115f..5af31b397f 100644 --- a/docs/personalization/enable_personalization.md +++ b/docs/personalization/enable_personalization.md @@ -347,7 +347,7 @@ and it eventually fetches the affected content and updates it internally. Therefore, it's crucial that you check whether the content export was successful, because certain references, for example, deeplinks and image references, are included. - If the export fails, the Personalization server does not have full content information. + If the export fails, the Personalization server doesn't have full content information. As a result, even if the recommendations are displayed, they might miss images, titles or deeplinks. diff --git a/docs/personalization/legacy_recommendation_api.md b/docs/personalization/legacy_recommendation_api.md index 7e7debe2a1..7afe65f3d1 100644 --- a/docs/personalization/legacy_recommendation_api.md +++ b/docs/personalization/legacy_recommendation_api.md @@ -270,5 +270,5 @@ An overview of pros and cons for each of the above techniques: |Works if JavaScript is disabled|Yes|depends|-|-|-| |Works for server without multithreading functionality|Yes|Yes|-|Yes|Yes| |Compatible with frontend caching on the server|-|-|-|Yes|Yes| -|Does not delay page rendering|-|depends|depends|Yes|Yes| +|Doesn't delay page rendering|-|depends|depends|Yes|Yes| |Supports authentication for recommendation fetching|Yes|Yes|Yes|-|depends| diff --git a/docs/pim/products.md b/docs/pim/products.md index b5f7b40bd1..ca088780cb 100644 --- a/docs/pim/products.md +++ b/docs/pim/products.md @@ -62,7 +62,7 @@ Codes for product variants are generated automatically based on the [selected st Each product variant has separate availability and stock information. Each variant can also have separate price rules. -If a variant does not have separate price rules, it uses the price of its base product. +If a variant doesn't have separate price rules, it uses the price of its base product. ## Product assets @@ -85,7 +85,7 @@ The stock can also be set to infinite (for example, in case of digital products) !!! note - Availability does not automatically mean that a product can be ordered. + Availability doesn't automatically mean that a product can be ordered. A product can be available, but have zero stock. A product can only be ordered when it has either positive stock, or stock set to infinite. diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index c1150b2962..9f1502a594 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -42,7 +42,7 @@ It enables you to manually select a set of content items to be displayed. To enable adding content to a Collection block in a clean installation, you need to configure the views for the block and define which content types can be embedded in it. - + For more information and an example, see [block templates](https://doc.ibexa.co/en/latest/content_management/pages/page_blocks/#block-templates). #### RecommendationBundle adapted for YooChoose v2 @@ -69,7 +69,7 @@ full support, maintenance, and priority security patch handling as they're used !!! note - Not supported for clean/new installs, intended for use with migrations. The Legacy Bridge integration does not have same performance, + Not supported for clean/new installs, intended for use with migrations. The Legacy Bridge integration doesn't have same performance, scalability or integrated experience as pure Platform setup. There are known edge cases where for instance cache or search index won't always be immediately updated across the two systems using the bridge, which is one of the many reasons why we recommend a pure Platform setup where that is possible. diff --git a/docs/release_notes/ez_platform_v2.2.0.md b/docs/release_notes/ez_platform_v2.2.0.md index 819ef97ba7..d3f8a277ff 100644 --- a/docs/release_notes/ez_platform_v2.2.0.md +++ b/docs/release_notes/ez_platform_v2.2.0.md @@ -18,7 +18,7 @@ This version introduces the **Page Builder** which replaces the landing page edi !!! note - The Page Builder does not offer all blocks that landing page editor did. + The Page Builder doesn't offer all blocks that landing page editor did. The removed blocks include Schedule and Form blocks. They will be included again in a future release. diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index 62a079bd7d..e7b29f81c3 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -216,14 +216,14 @@ You can now translate labels of choice attributes in Custom tags using the `ezri ### API improvements -`SectionService::loadSection` has been improved to return a filtered list when user does not have access to a Section, +`SectionService::loadSection` has been improved to return a filtered list when user doesn't have access to a Section, instead of throwing an exception. ## eZ Platform v2.5.4 ### Permission improvements -`RoleService` methods have been improved to return a filtered list when user does not have access to content, +`RoleService` methods have been improved to return a filtered list when user doesn't have access to content, instead of throwing an exception. The following methods are affected: - `RoleService::loadRoles` diff --git a/docs/resources/contributing/package_structure.md b/docs/resources/contributing/package_structure.md index b9ee34266b..9642ce6d78 100644 --- a/docs/resources/contributing/package_structure.md +++ b/docs/resources/contributing/package_structure.md @@ -48,7 +48,7 @@ The general package directory structure and corresponding PHP namespace mapping | +-- lib (`Ibexa\Tests\`) ``` -If a package does not contain some of the described parts, you can skip those directories. +If a package doesn't contain some of the described parts, you can skip those directories. ### Implementation (lib) diff --git a/docs/search/criteria_reference/languagecode_criterion.md b/docs/search/criteria_reference/languagecode_criterion.md index 3c9a1c0586..d861abd22f 100644 --- a/docs/search/criteria_reference/languagecode_criterion.md +++ b/docs/search/criteria_reference/languagecode_criterion.md @@ -7,7 +7,7 @@ searches for content based on whether it's translated into the selected language - `value` - string(s) representing the language codes to search for - (optional) `matchAlwaysAvailable` - bool representing whether content with the `alwaysAvailable` flag -should be returned even if it does not contain the selected language (default `true`) +should be returned even if it doesn't contain the selected language (default `true`) ## Example diff --git a/docs/search/criteria_reference/logicalnot_criterion.md b/docs/search/criteria_reference/logicalnot_criterion.md index 1fcdd68b29..af3f583671 100644 --- a/docs/search/criteria_reference/logicalnot_criterion.md +++ b/docs/search/criteria_reference/logicalnot_criterion.md @@ -1,7 +1,7 @@ # LogicalNot Criterion The [`LogicalNot` Search Criterion](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Criterion-LogicalNot.html) -matches content URL if the provided Criterion does not match. +matches content URL if the provided Criterion doesn't match. It takes only one Criterion in the array parameter. diff --git a/docs/search/search_api.md b/docs/search/search_api.md index 13f2f1fdd1..b8935b9b6f 100644 --- a/docs/search/search_api.md +++ b/docs/search/search_api.md @@ -115,7 +115,7 @@ You can use the `ContentService::find(Filter)` method to find content items or `ContentService::find` returns an iterable [`ContentList`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentList.html) while `LocationService::find` returns an iterable [`LocationList`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LocationList.html). -Filtering differs from search. It does not use the `SearchService` and isn't based on indexed data. +Filtering differs from search. It doesn't use the `SearchService` and isn't based on indexed data. [`Filter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Filter-Filter.html) enables you to configure a query using chained methods to select criteria, sorting, limit and offset. @@ -262,7 +262,7 @@ This also shows that you can get the total number of search results using the `t You can also nest different operators to construct more complex queries. The example below uses the `LogicalNot` operator to search for all content containing a given phrase -that does not belong to the provided Section: +that doesn't belong to the provided Section: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/FindComplexCommand.php', 45, 46) =]][[= include_file('code_samples/api/public_php_api/src/Command/FindComplexCommand.php', 48, 53) =]] @@ -389,7 +389,7 @@ $query->aggregations[] = new IntegerRangeAggregation('range', 'person', 'age', The beginning of the range is included and the end is excluded, so a range between 1 and 30 includes value `1`, but not `30`. - `null` means that a range does not have an end. + `null` means that a range doesn't have an end. In the example all values above (and including) 60 are included in the last range. See [Agrregation reference](aggregation_reference.md) for details of all available aggregations. diff --git a/docs/search/search_engines/elastic_search/configure_elastic_search.md b/docs/search/search_engines/elastic_search/configure_elastic_search.md index b33b98e615..a96576c397 100644 --- a/docs/search/search_engines/elastic_search/configure_elastic_search.md +++ b/docs/search/search_engines/elastic_search/configure_elastic_search.md @@ -133,7 +133,7 @@ For more information and a list of available choices, see [Connection pool](http !!! tip "Load tests recommendation" If you change the connection pool setting, it's recommended that you to perform load tests - to check whether the change does not negatively impact the performance of your environment. + to check whether the change doesn't negatively impact the performance of your environment. #### Connection selector diff --git a/docs/search/search_engines/search_engines.md b/docs/search/search_engines/search_engines.md index 7b4556a7a3..02cbae1d5a 100644 --- a/docs/search/search_engines/search_engines.md +++ b/docs/search/search_engines/search_engines.md @@ -21,7 +21,7 @@ Currently, they exist in their own [[= product_name =]] Bundles: | Index-time boosting | No | No | Query-time boosting\*\*\* | | Aggregations | No | Yes | Yes | -\* Usage of Criteria and Sort Clauses for fields does not perform well on medium to larger +\* Usage of Criteria and Sort Clauses for fields doesn't perform well on medium to larger amount of data with Legacy Search Engine (SQL). \*\* For more information about fulltext search syntax support, see [Fulltext Criterion](fulltext_criterion.md). diff --git a/docs/search/search_engines/solr_search_engine/install_solr.md b/docs/search/search_engines/solr_search_engine/install_solr.md index 8477f3e79d..25cea6ed37 100644 --- a/docs/search/search_engines/solr_search_engine/install_solr.md +++ b/docs/search/search_engines/solr_search_engine/install_solr.md @@ -50,7 +50,7 @@ To set SolrCloud up follow [SolrCloud reference guide](https://lucene.apache.org ### Continue Solr configuration -The bundle does not commit Solr index changes directly on Repository updates, leaving it up to you to tune this using `solrconfig.xml` as best practice suggests. +The bundle doesn't commit Solr index changes directly on Repository updates, leaving it up to you to tune this using `solrconfig.xml` as best practice suggests. This setting is **required** if you want to see the changes after publish. it's strongly recommended to set-up `solrconfig.xml` like this: @@ -263,7 +263,7 @@ ibexa: ## Clear prod cache -While Symfony `dev` environment keeps track of changes to YAML files, `prod` does not, so clear the cache to make sure Symfony reads the new config: +While Symfony `dev` environment keeps track of changes to YAML files, `prod` doesn't, so clear the cache to make sure Symfony reads the new config: ``` bash php bin/console --env=prod cache:clear @@ -288,7 +288,7 @@ Here are the most common issues you may encounter: - Exception on unsupported field types - Make sure to implement all field types in your installation, or to configure missing ones as [NullType](nullfield.md) if implementation isn't needed. - Content isn't immediately available  - - Solr Bundle on purpose does not commit changes directly on Repository updates *(on indexing)*, but lets you control this using Solr configuration. Adjust Solr's `autoSoftCommit` (visibility of changes to search index) and/or `autoCommit` (hard commit, for durability and replication) to balance performance and load on your Solr instance against needs you have for "[NRT](https://cwiki.apache.org/confluence/display/solr/Near+Real+Time+Searching)". + - Solr Bundle on purpose doesn't commit changes directly on Repository updates *(on indexing)*, but lets you control this using Solr configuration. Adjust Solr's `autoSoftCommit` (visibility of changes to search index) and/or `autoCommit` (hard commit, for durability and replication) to balance performance and load on your Solr instance against needs you have for "[NRT](https://cwiki.apache.org/confluence/display/solr/Near+Real+Time+Searching)". - Running out of memory during indexing - In general make sure to run indexing using the prod environment to avoid debuggers and loggers from filling up memory. - Flysystem: You can find further info in https://issues.ibexa.co/browse/EZP-25325. \ No newline at end of file diff --git a/docs/search/url_search_reference/logicalnot_url_criterion.md b/docs/search/url_search_reference/logicalnot_url_criterion.md index c03b916c89..9a2c8e07b9 100644 --- a/docs/search/url_search_reference/logicalnot_url_criterion.md +++ b/docs/search/url_search_reference/logicalnot_url_criterion.md @@ -1,7 +1,7 @@ # LogicalNot Criterion The [`LogicalNot` URL Criterion](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-URL-Query-Criterion-LogicalNot.html) -matches a URL if the provided Criterion does not match. +matches a URL if the provided Criterion doesn't match. It takes only one Criterion in the array parameter. diff --git a/docs/snippets/catalog_permissions_note.md b/docs/snippets/catalog_permissions_note.md index 802bfcb9fb..568d71face 100644 --- a/docs/snippets/catalog_permissions_note.md +++ b/docs/snippets/catalog_permissions_note.md @@ -1,4 +1,4 @@ !!! note - By default, the anonymous user does not have permissions to view products. + By default, the anonymous user doesn't have permissions to view products. To change this, add the `Product/View` Policy to the Anonymous Role. diff --git a/docs/templating/design_engine/add_new_design.md b/docs/templating/design_engine/add_new_design.md index 0cb5f8c672..6efb8045fe 100644 --- a/docs/templating/design_engine/add_new_design.md +++ b/docs/templating/design_engine/add_new_design.md @@ -115,7 +115,7 @@ This is because you defined `standard` design as fallback for this SiteAccess: In this case, if the design engine cannot find a template for the current design, it uses the template from the next configured design. -In the case above, the engine does not find the footer template for the `campaign` SiteAccess, +In the case above, the engine doesn't find the footer template for the `campaign` SiteAccess, so it uses the one from `standard`. This way you don't need to provide all templates for a new design, but only those that you want to be different than the fallback one. diff --git a/docs/templating/embed_and_list_content/render_images.md b/docs/templating/embed_and_list_content/render_images.md index c8938cb6ae..f95e229942 100644 --- a/docs/templating/embed_and_list_content/render_images.md +++ b/docs/templating/embed_and_list_content/render_images.md @@ -39,7 +39,7 @@ returns the identifier of the first image Field that isn't empty. !!! caution This function works only for [Image](imagefield.md) Fields. - It does not work for [ImageAsset](imageassetfield.md) Fields. + It doesn't work for [ImageAsset](imageassetfield.md) Fields. ## Configure image variation @@ -75,7 +75,7 @@ To use it, select the variation when rendering the image: ## Use focal point In the [image editor](configure_image_editor.md) you can define a focal point for an image. -The focal point does not have an instant effect when you use the default templates. +The focal point doesn't have an instant effect when you use the default templates. However, you can use it to select the part of the image the view focuses on when the image is cropped. The following example shows how to use an image contained in an Image Field as a focussed background. diff --git a/docs/templating/image_variations.md b/docs/templating/image_variations.md index 984d5e14c8..608e9a3e8b 100644 --- a/docs/templating/image_variations.md +++ b/docs/templating/image_variations.md @@ -51,8 +51,8 @@ If set to `null` or `~`, the variation takes the original image for reference. | `geometry/scalewidth` | `[width]` | Scales image width, both up and down. Preserves aspect ratio. | | `geometry/scaleheight` | `[height]` | Scales image height, both up and down. Preserves aspect ratio. | | `geometry/scale` | `[width, height]` | Scales image size to the provided width and height, both up and down. Preserves aspect ratio. | -| `geometry/scaleexact` | `[width, height]` | Scales image to exactly fit the provided width and height. Does not preserve aspect ratio. | -| `geometry/scalepercent` | `[widthPercent, heightPercent]` | Scales width and height by the provided percent values. Does not preserve aspect ratio. | +| `geometry/scaleexact` | `[width, height]` | Scales image to exactly fit the provided width and height. Doesn't preserve aspect ratio. | +| `geometry/scalepercent` | `[widthPercent, heightPercent]` | Scales width and height by the provided percent values. Doesn't preserve aspect ratio. | | `geometry/crop` | `[width, height, startX, startY]` | Crops the image. The result has the provided width/height, starting at the provided startX/startY | | `border` | `[thickBorderX, thickBorderY, color=#000]` | Adds a border around the image. Thickness is defined in px. Color is `#000` by default. | | `filter/noise` | `[radius=0]` | Smooths the contours of an image (`imagick`/`gmagick` only). `radius` is in px. | diff --git a/docs/templating/render_content/customize_product_view.md b/docs/templating/render_content/customize_product_view.md index 9aa506faad..19014106fb 100644 --- a/docs/templating/render_content/customize_product_view.md +++ b/docs/templating/render_content/customize_product_view.md @@ -37,7 +37,7 @@ To do it, create your own template in `templates/themes/storefront/storefront/co {% endif %} ``` -This template adds a "price currently unavailable" label when a product does not have a price specified. +This template adds a "price currently unavailable" label when a product doesn't have a price specified. ## Available templates diff --git a/docs/templating/twig_function_reference/content_twig_functions.md b/docs/templating/twig_function_reference/content_twig_functions.md index 22594451c5..8e2ee2b6c1 100644 --- a/docs/templating/twig_function_reference/content_twig_functions.md +++ b/docs/templating/twig_function_reference/content_twig_functions.md @@ -58,7 +58,7 @@ You can pass one of the following rendering methods to `ibexa_render()`: `ibexa_content_name()` renders the name of a content item. The function uses prioritized languages from SiteAccess settings unless you pass another language as `forcedLanguage`. -If the content item does not have a translation in the prioritized or passed language, +If the content item doesn't have a translation in the prioritized or passed language, the function returns the name in the main language. | Argument | Type | Description | diff --git a/docs/templating/twig_function_reference/field_twig_functions.md b/docs/templating/twig_function_reference/field_twig_functions.md index 0a8e3ca08d..eecc2b6e7a 100644 --- a/docs/templating/twig_function_reference/field_twig_functions.md +++ b/docs/templating/twig_function_reference/field_twig_functions.md @@ -77,7 +77,7 @@ Some field types, like the [MapLocation field type](maplocationfield.md), expect The function returns the value of the field only. To render the field with default or custom templates, use [`ibexa_render_field()`](#ibexa_render_field) instead. -If the content item does not have a translation in the prioritized or passed language, +If the content item doesn't have a translation in the prioritized or passed language, the function returns the value in the main language. | Argument | Type | Description | @@ -94,7 +94,7 @@ the function returns the value in the main language. `ibexa_field()` returns the field object. The field gives you access to the field value, the field's definition identifier, and field type identifier. -If the content item does not have a translation in the prioritized or passed language, +If the content item doesn't have a translation in the prioritized or passed language, the function returns the field object in the main language. | Argument | Type | Description | @@ -119,7 +119,7 @@ You can use `ibexa_field()` to access the field type identifier: `ibexa_field_name()` returns the name of a content item's field. The function uses prioritized languages from SiteAccess settings unless you pass another language as `forcedLanguage`. -If the content item does not have a translation in the prioritized or passed language, +If the content item doesn't have a translation in the prioritized or passed language, the function returns the name in the main language. | Argument | Type | Description | @@ -140,7 +140,7 @@ the function returns the name in the main language. `ibexa_field_description()` returns the description of a content item's field. The function uses prioritized languages from SiteAccess settings unless you pass another language as `forcedLanguage`. -If the content item does not have a translation in the prioritized or passed language, +If the content item doesn't have a translation in the prioritized or passed language, the function returns the description in the main language. | Argument | Type | Description | diff --git a/docs/templating/twig_function_reference/image_twig_functions.md b/docs/templating/twig_function_reference/image_twig_functions.md index 73a975b03d..c3f2751716 100644 --- a/docs/templating/twig_function_reference/image_twig_functions.md +++ b/docs/templating/twig_function_reference/image_twig_functions.md @@ -46,7 +46,7 @@ with the variation name passed as an argument, for example: !!! caution This function works only for [Image](imagefield.md) Fields. - It does not work for [ImageAsset](imageassetfield.md) Fields. + It doesn't work for [ImageAsset](imageassetfield.md) Fields. | Argument | Type | Description | | ------ |----- | ----- | diff --git a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md index 01edb6985c..997ecb0a21 100644 --- a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md +++ b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md @@ -17,7 +17,7 @@ To use a custom template when rendering the root content, create a `content_view When pasting YAML code, pay attention to indentation and levels. The code blocks shown here include the full structure of the YAML file to help you learn where to place new blocks. - Be careful not to duplicate existing keys, because YAML does not allow it. + Be careful not to duplicate existing keys, because YAML doesn't allow it. Edit `config/packages/ibexa.yaml`. Add the following block under `site` while paying attention to indentation - `content_view` should be one level below `site`: @@ -261,4 +261,4 @@ Refresh the page and you should see the "Hello world" placed inside a styled lay ![Homepage with a Hello world](bike_tutorial_hello_world.png) -At this point, the template is static. It does not render any dynamic data from the repository. +At this point, the template is static. It doesn't render any dynamic data from the repository. diff --git a/docs/tutorials/beginner_tutorial/6_improve_configuration.md b/docs/tutorials/beginner_tutorial/6_improve_configuration.md index c313794015..323a5b94c3 100644 --- a/docs/tutorials/beginner_tutorial/6_improve_configuration.md +++ b/docs/tutorials/beginner_tutorial/6_improve_configuration.md @@ -8,7 +8,7 @@ description: See how you can manage Ibexa DXP configuration files. Image variations are different versions of the same image. You can use them to scale images, crop them, add effects, etc. -So far the images in the ride list are fitted to the templates automatically, and the result does not look good. +So far the images in the ride list are fitted to the templates automatically, and the result doesn't look good. Now you can create a variation to specify how you want the images to look in detail. Create a new `config/packages/image_variations.yaml` file containing: diff --git a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md index 3681254569..a05ded89da 100644 --- a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md +++ b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md @@ -39,7 +39,7 @@ The Point 2D is going to store two elements (coordinates for point 2D): - `x` value - `y` value -At this point, it does not matter where they're stored. You want to focus on what the field type exposes as an API. +At this point, it doesn't matter where they're stored. You want to focus on what the field type exposes as an API. `src/FieldType/Point2D/Value.php` should have the following properties: diff --git a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md index 5f35d929a1..bdab60fd44 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md @@ -84,7 +84,7 @@ The operation is transactional and rolls back in case of errors. ##### Block migration -In v2.2 Page Builder does not offer all blocks that landing page editor did. The removed blocks include Keyword, Schedule, and Form blocks. +In v2.2 Page Builder doesn't offer all blocks that landing page editor did. The removed blocks include Keyword, Schedule, and Form blocks. The Places block has been removed from the clean installation and is only available in the demo out of the box. If you use this block in your site, re-apply its configuration based on the [demo](https://github.com/ezsystems/ezplatform-ee-demo/blob/v2.2.2/app/config/blocks.yml). diff --git a/docs/update_and_migration/from_4.0/to_4.1.md b/docs/update_and_migration/from_4.0/to_4.1.md index f62eb8151e..ee3b827bad 100644 --- a/docs/update_and_migration/from_4.0/to_4.1.md +++ b/docs/update_and_migration/from_4.0/to_4.1.md @@ -14,9 +14,9 @@ Go through the following steps to update to v4.1. During the update process you can encounter the following error: - `Failed to create closure from callable: class 'Ibexa\Bundle\Commerce\Eshop\Twig\SilvercommonExtension' does not have a method 'getNavigation'` + `Failed to create closure from callable: class 'Ibexa\Bundle\Commerce\Eshop\Twig\SilvercommonExtension' doesn't have a method 'getNavigation'` - You can ignore this error, it does not require any action on your part. + You can ignore this error, it doesn't require any action on your part. ## Update the app to latest version of v4.0 @@ -181,7 +181,7 @@ To use the legacy solution, in the `config/packages` folder, in YAML files with shop configuration, under the `parameters` key, make sure that the `ibexa.commerce.site_access.config.eshop.default.catalog_data_provider` parameter is set to `ez5`. -To use the new product catalog, since the new solution does not support the old +To use the new product catalog, since the new solution doesn't support the old price engine out of the box, in your price engine configuration, you must update the following parameters by providing the `Ibexa\\ProductCatalog\\Bridge\\PriceProvider` value in the `ibexa_setting` table, diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md b/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md index 909ec1f1f5..c0c40a46bf 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/common_issues.md @@ -45,7 +45,7 @@ php bin/console ezplatform:images:normalize-path ## Unknown relation type 0 -"Unknown relation type 0." error occurs only when using REST API. The issue does not occur +"Unknown relation type 0." error occurs only when using REST API. The issue doesn't occur the first time article is published (upon creation). It only happens after the article is edited and published. diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md index 9deefb8e9c..90059905b6 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish.md @@ -14,7 +14,7 @@ The release of eZ Platform brought about an inevitable disruption in backwards c ### Incompatibilities with legacy -eZ Platform represents the 6th generation of eZ Publish, and while the 5th generation had* *a major focus on backwards code compatibility with the 3rd and 4th generations *(legacy)*, the 6th generation does not. +eZ Platform represents the 6th generation of eZ Publish, and while the 5th generation had* *a major focus on backwards code compatibility with the 3rd and 4th generations *(legacy)*, the 6th generation doesn't. The 6th generation is aimed at being fully backwards compatible on the following: diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index e0142e272f..829faadb7f 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -173,7 +173,7 @@ If you don't plan to migrate content directly to newer eZ Platform field types, !!! note - The Legacy Bridge integration does not have the same performance, scalability or integrated experience as a pure Platform setup. Like on eZ Publish Platform 5.x there are known edge cases where, for instance, cache or search index won't always be immediately updated across the two systems using the bridge. This is one of the many reasons why we recommend a pure Platform setup where that is possible. + The Legacy Bridge integration doesn't have the same performance, scalability or integrated experience as a pure Platform setup. Like on eZ Publish Platform 5.x there are known edge cases where, for instance, cache or search index won't always be immediately updated across the two systems using the bridge. This is one of the many reasons why we recommend a pure Platform setup where that is possible. #### 2.5.1 Set up symlinks for legacy folders diff --git a/docs/users/invitations.md b/docs/users/invitations.md index 5af3d6b00d..1989284d22 100644 --- a/docs/users/invitations.md +++ b/docs/users/invitations.md @@ -40,7 +40,7 @@ For example, use the following [configuration](configuration.md#configuration-fi ``` Here, you can specify which template should be used for the invitation mail, and what should be the expiration time for the invitation link included in that mail. -If a user does not click the invitation link sent to them in time, you can refresh the invitation. +If a user doesn't click the invitation link sent to them in time, you can refresh the invitation. Refresh resets the time limit and changes the hash in the invitation link. You can find more registration related templates in [Register new users documentation](user_registration.md#other-user-management-templates). \ No newline at end of file diff --git a/docs/users/passwords.md b/docs/users/passwords.md index 56016808a9..a74cc073cc 100644 --- a/docs/users/passwords.md +++ b/docs/users/passwords.md @@ -108,7 +108,7 @@ To do this, in the **User account (ezuser)** field definition, select "Password ![Protection against using breached passwords](password_breached.png) This rule checks the password against known password dumps by using the https://haveibeenpwned.com/ API. -It does not check existing passwords, so it won't block login for anyone. It applies only to new passwords when users change them. +It doesn't check existing passwords, so it won't block login for anyone. It applies only to new passwords when users change them. !!! note diff --git a/docs/users/user_authentication.md b/docs/users/user_authentication.md index 9eebe34a38..3ecfe1f4f9 100644 --- a/docs/users/user_authentication.md +++ b/docs/users/user_authentication.md @@ -14,7 +14,7 @@ This is mainly for the kernel to be able to manage content-related permissions ( Depending on your context, you either want to create a Platform user, return an existing user, or even always use a generic user. -Whenever an *external* user is matched (i.e. one that does not come from Platform repository, like coming from LDAP), [[= product_name =]] kernel initiates an `MVCEvents::INTERACTIVE_LOGIN` event. +Whenever an *external* user is matched (i.e. one that doesn't come from Platform repository, like coming from LDAP), [[= product_name =]] kernel initiates an `MVCEvents::INTERACTIVE_LOGIN` event. Every service listening to this event receives an `Ibexa\Core\MVC\Symfony\Event\InteractiveLoginEvent` object which contains the original security token (that holds the matched user) and the request. Then, it's up to the listener to retrieve a Platform user from the repository and to assign it back to the event object. From 7679df71dccc672bcdf23d2e8a006bf017920db6 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 15:19:46 +0200 Subject: [PATCH 19/77] More fixes --- docs/administration/admin_panel/corporate_admin_panel.md | 2 +- docs/administration/admin_panel/roles_admin_panel.md | 5 +++-- .../administration/admin_panel/url_management_admin_panel.md | 2 +- docs/administration/admin_panel/workflow_admin_panel.md | 2 +- docs/content_management/file_management/file_management.md | 4 +++- docs/infrastructure_and_maintenance/clustering/clustering.md | 2 +- docs/infrastructure_and_maintenance/devops.md | 4 +++- docs/infrastructure_and_maintenance/performance.md | 3 ++- docs/permissions/permission_overview.md | 3 +-- docs/release_notes/ez_platform_v1.10.0.md | 4 +++- docs/release_notes/ez_platform_v1.12.0.md | 2 +- docs/release_notes/ez_platform_v3.0_deprecations.md | 3 ++- docs/search/reindex_search.md | 2 +- .../search_engines/solr_search_engine/solr_overview.md | 2 +- 14 files changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/administration/admin_panel/corporate_admin_panel.md b/docs/administration/admin_panel/corporate_admin_panel.md index 11b4be2fac..702a3ed0c7 100644 --- a/docs/administration/admin_panel/corporate_admin_panel.md +++ b/docs/administration/admin_panel/corporate_admin_panel.md @@ -10,4 +10,4 @@ There, in the **Corporate** section, you can find basic information about existi ![Corporate section](admin_panel_corporate.png "Corporate section") -See [Customer management](https://doc.ibexa.co/projects/userguide/en/latest/customer_management/manage_customers/) for further information. \ No newline at end of file +For more information, see [Customer management](https://doc.ibexa.co/projects/userguide/en/latest/customer_management/manage_customers/). \ No newline at end of file diff --git a/docs/administration/admin_panel/roles_admin_panel.md b/docs/administration/admin_panel/roles_admin_panel.md index 6c1b5b613c..cbc6d06f1c 100644 --- a/docs/administration/admin_panel/roles_admin_panel.md +++ b/docs/administration/admin_panel/roles_admin_panel.md @@ -24,7 +24,8 @@ See [example use case](permission_use_cases.md#restrict-editing-to-part-of-the-t Limitation specifies what a user can do, not what they can't do. A `Location` limitation, for example, gives the user access to content with a specific Location, not prohibits it. - See [Limitation reference](limitation_reference.md) for further information. + + For more information, see [Limitation reference](limitation_reference.md). **Assignments** @@ -40,4 +41,4 @@ That way system is be more secure and easier to manage. This approach also improves performance. Role assignments and policies are taken into account during search/load queries. -See [Permissions overview](permissions.md) for further information and [Permission use cases](permission_use_cases.md) for details on how to customize access to different parts of the back office. \ No newline at end of file +For more information, see [Permissions overview](permissions.md) and [Permission use cases](permission_use_cases.md). \ No newline at end of file diff --git a/docs/administration/admin_panel/url_management_admin_panel.md b/docs/administration/admin_panel/url_management_admin_panel.md index 23bb6d5292..1b5fd61b87 100644 --- a/docs/administration/admin_panel/url_management_admin_panel.md +++ b/docs/administration/admin_panel/url_management_admin_panel.md @@ -7,6 +7,6 @@ description: URL Management lets you manage external URL addresses and URL wildc You can manage external URL addresses and URL wildcards in the **Admin** panel. Configure URL aliases to have human-readable URL addresses throughout your system. -See [URL management](url_management.md) for further information. +For more information, see [URL management](url_management.md). ![URL Management](admin_panel_url_management.png "URL Management") \ No newline at end of file diff --git a/docs/administration/admin_panel/workflow_admin_panel.md b/docs/administration/admin_panel/workflow_admin_panel.md index 3aed53885a..85bc924ec4 100644 --- a/docs/administration/admin_panel/workflow_admin_panel.md +++ b/docs/administration/admin_panel/workflow_admin_panel.md @@ -7,6 +7,6 @@ description: The workflow functionality passes a content item version through a The workflow functionality passes a content item version through a series of stages. Each workflow consists of stages and transitions between them. -See [Workflow](workflow.md) for further information. +For more information, see [Workflow](workflow.md). ![Workflow](admin_panel_workflow.png "Workflow") \ No newline at end of file diff --git a/docs/content_management/file_management/file_management.md b/docs/content_management/file_management/file_management.md index 8eabc2ec0d..8da985d99b 100644 --- a/docs/content_management/file_management/file_management.md +++ b/docs/content_management/file_management/file_management.md @@ -121,4 +121,6 @@ To learn how to configure other adapters, see the [bundle's online documentation ### DFS Cluster handler For clustering, the platform provides a custom metadata handler that stores metadata about your assets in the database. -This is faster than accessing the remote NFS or S3 instance to read metadata. For further reading on setting this up, see [Clustering](clustering.md). +This is faster than accessing the remote NFS or S3 instance to read metadata. + +For more information, see [Clustering](clustering.md). diff --git a/docs/infrastructure_and_maintenance/clustering/clustering.md b/docs/infrastructure_and_maintenance/clustering/clustering.md index a15134289f..d8c3f5ab6a 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering.md @@ -22,7 +22,7 @@ The minimal requirements are: - Shared database (using MySQL/MariaDB) - [Shared binary files](#shared-binary-files) (using NFS, or S3) -For further details on requirements, see [Requirements page](requirements.md). +For more information on requirements, see [Requirements page](requirements.md). It's also recommended to use: diff --git a/docs/infrastructure_and_maintenance/devops.md b/docs/infrastructure_and_maintenance/devops.md index e06d59a85b..e58ed5b42b 100644 --- a/docs/infrastructure_and_maintenance/devops.md +++ b/docs/infrastructure_and_maintenance/devops.md @@ -8,7 +8,9 @@ description: See various tools that can help you debug your Ibexa DXP installati ### Clearing file cache using the Symfony cache:clear command -Symfony provides a command for clearing cache. It deletes all file-based caches, which mainly consist of a Twig template, a [service container](php_api.md#service-container), and the Symfony route cache, but also everything else stored in the cache folder. Out of the box on a single-server setup this includes Content cache. For further information on the command's use, see its help text: +Symfony provides a command for clearing cache. It deletes all file-based caches, which mainly consist of a Twig template, a [service container](php_api.md#service-container), and the Symfony route cache, but also everything else stored in the cache folder. Out of the box on a single-server setup this includes Content cache.  + +For further information on the command's use, see its help text: ``` bash php bin/console --env=prod cache:clear -h diff --git a/docs/infrastructure_and_maintenance/performance.md b/docs/infrastructure_and_maintenance/performance.md index 164828cdd1..2a15e4feff 100644 --- a/docs/infrastructure_and_maintenance/performance.md +++ b/docs/infrastructure_and_maintenance/performance.md @@ -78,7 +78,8 @@ In production setups: - If you use Redis, make sure to tune it for in-memory cache usage. Its persistence feature isn't needed with cache and severely slows down execution time. - [For use with sessions](sessions.md#cluster-setup) however, persistence can be a good fit if you want sessions to survive service interruptions. - - Further tips for Redis with cache can be found in doc regarding [Redis Clustering](persistence_cache.md#redis-clustering). + +For more information, see [Redis Clustering](persistence_cache.md#redis-clustering). ### Search diff --git a/docs/permissions/permission_overview.md b/docs/permissions/permission_overview.md index 8eb4eb0902..3390f3c788 100644 --- a/docs/permissions/permission_overview.md +++ b/docs/permissions/permission_overview.md @@ -17,8 +17,7 @@ For example, a `content/publish` policy with a `ContentType` limitation on the " A limitation, like a policy, specifies what a user *can* do, not what they *can't do*. A `Section` limitation, for example, *gives* the user access to the selected Section, not *prohibits* it. -See [Limitation reference](limitation_reference.md) for further information -and [Permission use cases](permission_use_cases.md) for example permission setups. +For more information, see [Limitation reference](limitation_reference.md) and [Permission use cases](permission_use_cases.md). ## Assigning roles to users diff --git a/docs/release_notes/ez_platform_v1.10.0.md b/docs/release_notes/ez_platform_v1.10.0.md index 2445b6244d..3cd736d438 100644 --- a/docs/release_notes/ez_platform_v1.10.0.md +++ b/docs/release_notes/ez_platform_v1.10.0.md @@ -23,7 +23,9 @@ This is a first step. We aim to provide more in terms of table support in the ed #### New Design Engine -This is a new way to handle design, theming and design overrides, similar to what we had in eZ Publish. It enables you to define different Themes which are collections of assets and templates. You can then assemble Themes (that can override each other) to define Designs, and eventually, assign a Design to a SiteAccess. This is a powerful concept that we aim to use in our out-of-the-box templates and demo sites. It comes especially handy when using eZ Platform for a multisite installation and willing to reuse design parts. Further info can be found in the [Bundle documentation](https://github.com/ezsystems/ezplatform-design-engine/tree/master/doc). +This is a new way to handle design, theming and design overrides, similar to what we had in eZ Publish. It enables you to define different Themes which are collections of assets and templates. You can then assemble Themes (that can override each other) to define Designs, and eventually, assign a Design to a SiteAccess. This is a powerful concept that we aim to use in our out-of-the-box templates and demo sites. It comes especially handy when using eZ Platform for a multisite installation and willing to reuse design parts. + +For more information, see [Bundle documentation](https://github.com/ezsystems/ezplatform-design-engine/tree/master/doc). ![](newdesigntable.png) diff --git a/docs/release_notes/ez_platform_v1.12.0.md b/docs/release_notes/ez_platform_v1.12.0.md index 1b014c2be0..dd54502e29 100644 --- a/docs/release_notes/ez_platform_v1.12.0.md +++ b/docs/release_notes/ez_platform_v1.12.0.md @@ -85,7 +85,7 @@ To update to this version, follow the [updating guide](https://doc.ibexa.co/en/ - There is a new VCL - Requires Varnish 4.1+ with `varnish-modules` _(incl. xkey)_, or Varnish Plus where it's built in - Further reading in [doc/varnish/varnish.md](https://github.com/ezsystems/ezplatform/blob/master/doc/varnish/varnish.md). + For more information, see [doc/varnish/varnish.md](https://github.com/ezsystems/ezplatform/blob/master/doc/varnish/varnish.md). #### How to still use the old VCL and the old X-Location-Id headers diff --git a/docs/release_notes/ez_platform_v3.0_deprecations.md b/docs/release_notes/ez_platform_v3.0_deprecations.md index a71a0f5d5d..a362cb5e43 100644 --- a/docs/release_notes/ez_platform_v3.0_deprecations.md +++ b/docs/release_notes/ez_platform_v3.0_deprecations.md @@ -55,7 +55,8 @@ The following tags used to register field type features in the [service containe |`ezpublish.fieldType.externalStorageHandler.gateway`|`ezplatform.field_type.external_storage_handler.gateway`| Deprecated method `eZ\Publish\SPI\FieldType\FieldType::getName` is now supported with a new signature similar to `eZ\Publish\SPI\FieldType\Nameable::getFieldName()`, which has been removed. -See [eZ Platform v3.0 project update](https://doc.ibexa.co/en/latest/updating/4_3_upgrade_field_types) for further information. + +For more information, see [eZ Platform v3.0 project update](https://doc.ibexa.co/en/latest/updating/4_3_upgrade_field_types). The deprecated `eZ\Publish\Core\FieldType\RichText` namespace has been removed, as it was moved to a separate bundle in v2.4. diff --git a/docs/search/reindex_search.md b/docs/search/reindex_search.md index 81c64b041c..65e4f9220f 100644 --- a/docs/search/reindex_search.md +++ b/docs/search/reindex_search.md @@ -22,4 +22,4 @@ php bin/console ibexa:reindex --since=yesterday php bin/console ibexa:reindex --content-ids=3,45,33 ``` -For further info on possible options, see `php bin/console ibexa:reindex --help`. +For more information, see `php bin/console ibexa:reindex --help`. diff --git a/docs/search/search_engines/solr_search_engine/solr_overview.md b/docs/search/search_engines/solr_search_engine/solr_overview.md index 760aacc3f3..b4fc8784d8 100644 --- a/docs/search/search_engines/solr_search_engine/solr_overview.md +++ b/docs/search/search_engines/solr_search_engine/solr_overview.md @@ -10,4 +10,4 @@ When you enable Solr and re-index your content, all your existing Search queries This allows you to scale up your [[= product_name =]] installation and be able to continue development locally against SQL engine, and have a test infrastructure, Staging and Prod powered by Solr. By this, it also removes considerable load from your database. -For further information on the architecture of [[= product_name =]], see [Architecture](architecture.md). \ No newline at end of file +For more information on the architecture of [[= product_name =]], see [Architecture](architecture.md). \ No newline at end of file From dd8018e23cd1f68580eeeeba6e6307678f7b0868 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Tue, 15 Oct 2024 15:48:49 +0200 Subject: [PATCH 20/77] Batch of fixes --- .../2_create_the_content_model.md | 24 ++++++------ .../3_customize_the_front_page.md | 21 ++++++---- .../4_display_single_content_item.md | 4 +- .../5_display_a_list_of_content_items.md | 3 +- .../6_improve_configuration.md | 17 +++++--- .../beginner_tutorial/7_embed_content.md | 5 ++- .../8_enable_account_registration.md | 24 +++++++----- .../1_implement_the_point2d_value_class.md | 4 +- .../2_define_point2d_field_type.md | 3 +- .../generic_field_type/5_add_a_field.md | 8 ++-- .../generic_field_type/6_settings.md | 4 +- .../generic_field_type/7_add_a_validation.md | 2 +- .../generic_field_type/8_data_migration.md | 10 ++--- .../creating_a_point2d_field_type.md | 9 +++-- .../1_get_a_starter_website.md | 20 ++++++---- .../2_prepare_the_landing_page.md | 39 +++++++++++-------- .../3_use_existing_blocks.md | 23 ++++++----- .../4_create_a_custom_block.md | 18 ++++++--- .../5_create_newsletter_form.md | 19 ++++----- docs/users/customer_groups.md | 3 +- docs/users/oauth_client.md | 3 +- docs/users/oauth_server.md | 6 +-- docs/users/passwords.md | 3 +- docs/users/user_authentication.md | 2 +- docs/users/user_management_guide.md | 15 ++++--- docs/users/user_registration.md | 6 ++- docs/users/users.md | 3 +- 27 files changed, 168 insertions(+), 130 deletions(-) diff --git a/docs/tutorials/beginner_tutorial/2_create_the_content_model.md b/docs/tutorials/beginner_tutorial/2_create_the_content_model.md index a515ce1ee3..0393635c3f 100644 --- a/docs/tutorials/beginner_tutorial/2_create_the_content_model.md +++ b/docs/tutorials/beginner_tutorial/2_create_the_content_model.md @@ -4,16 +4,19 @@ description: Learn how to create a content model consisting of content types and # Step 2 — Create the content model -How your content is structured is a very important part of an [[= product_name =]] project. Think of it as the database design of your application. +How your content is structured is an important part of an [[= product_name =]] project. +Think of it as the database design of your application. To get full information, read the [content model](content_model.md) documentation page. Below is a short introduction that only covers points needed for this tutorial. ## Content model overview -The [[= product_name =]] content repository is centered around **content items**. A content item is a single piece of content, for example an article, a product review, a place, etc. +The [[= product_name =]] content repository is centered around **content items**. +A content item is a single piece of content, for example an article, a product review, a place, etc. -Every content item is an instance of a content type. Content types define what **Fields** are included in each content item. +Every content item is an instance of a content type. +Content types define what **Fields** are included in each content item. For example, an article could include fields such as *title*, *image*, *abstract*, *article's body*, *publication date* and *list of authors*. Fields can belong to one of the installed **field types**, about 30 in the default distribution. @@ -27,7 +30,7 @@ The site use two content types: **Ride** and **Landmark**. A Ride is a route of a bike trip. It can include one or more Landmarks - interesting places you can see along the way. More than one Ride can visit the same Landmark, so it's similar to an N-N relationship model in a database. -In this step you'll add the first content type, Ride. +In this step you add the first content type, Ride. Go to the admin interface (`/admin`) and log in with the default username: `admin` and the default password: `publish`.  @@ -63,18 +66,17 @@ Confirm the creation of the content type by clicking **Save and close**. !!! note - If you're using [[= product_name_exp =]], the root content item in your installation is - a Page called "Ibexa Digital Experience Platform". - + If you're using [[= product_name_exp =]], the root content item in your installation is a Page called "Ibexa Digital Experience Platform". + For this tutorial, swap it with its child, a Folder called "Ibexa Platform". - + To do this, in the main menu go to **Content** -> **Content structure** -> **Ibexa Digital Experience Platform**, select the **Locations** tab and in the **Swap Locations** section navigate to "Ibexa Platform". - + You can learn how to work with Pages in [another tutorial](page_and_form_tutorial.md). -Go back to the content by selecting **Content structure** in the main menu. -Then browse the content tree and create a Folder named *All Rides* using the **Create content** button on the top right of the screen. +Go back to the content by selecting **Content structure** in the main menu. +Then browse the content tree and create a Folder named *All Rides* using the **Create content** button on the top right of the screen. Publish the Folder. While in the folder, create a few of Rides using the **Create content** button, add photos and publish them. diff --git a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md index 997ecb0a21..bd133eba1e 100644 --- a/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md +++ b/docs/tutorials/beginner_tutorial/3_customize_the_front_page.md @@ -6,7 +6,8 @@ description: Try customizing the front page by using custom templates and adding In this step you can create the global layout of your site, and display content using custom templates. -First, go to the root of the site (``). You should now see the home page of the clean install, without any kind of layout. +First, go to the root of the site (``). +You should now see the home page of the clean install, without any kind of layout. You can customize this step by instructing the platform to use a custom template to render this content item. ## Content rendering configuration @@ -41,7 +42,8 @@ This tells [[= product_name =]] to use the `template` when rendering content wit !!! note "Clear the cache" - Each time you change the YAML files, you should clear the cache. It's not mandatory in dev environment. + Each time you change the YAML files, you should clear the cache. + It's not mandatory in dev environment. To clear the cache: @@ -178,7 +180,8 @@ This tutorial leads you through configuring Webpack, but first you need assets. ### Adding assets -The site has no stylesheets or assets yet. You need to download [`assets.zip`](img/assets.zip) which contains the prepared asset files. +The site has no stylesheets or assets yet. +You need to download [`assets.zip`](img/assets.zip) which contains the prepared asset files. Then unpack its contents to the following directories: @@ -193,7 +196,8 @@ Before proceeding, ensure that the structure of the added files looks like this: In [[= product_name =]], you can add assets by using [Symfony Webpack Encore]([[= symfony_doc =]]/frontend.html#webpack-encore) — an integration of Webpack that enables you to build bundles of CSS stylesheets and JS scripts and add them to the project. -For more details, see [Importing assets from a bundle](importing_assets_from_bundle.md). + +For more information, see [Importing assets from a bundle](importing_assets_from_bundle.md). To create bundles, first, indicate which files to include in them. @@ -236,9 +240,11 @@ To add one template to another, edit `templates/full/home_page.html.twig` and re ``` The templating language Twig supports [template inheritance](https://twig.symfony.com/doc/3.x/tags/extends.html). -Templates can contain named blocks. Any template can extend other templates, and modify the blocks defined by its parents. +Templates can contain named blocks. +Any template can extend other templates, and modify the blocks defined by its parents. -The code above points to `main_layout.html.twig` in line 1. It also wraps your "Hello world" message in a `content` block. +The code above points to `main_layout.html.twig` in line 1. +It also wraps your "Hello world" message in a `content` block. If you look back at the main layout template, you can see an empty `{% block content %}{% endblock %}` section (lines 52-53). This is where the `home_page.html.twig` is rendered. @@ -261,4 +267,5 @@ Refresh the page and you should see the "Hello world" placed inside a styled lay ![Homepage with a Hello world](bike_tutorial_hello_world.png) -At this point, the template is static. It doesn't render any dynamic data from the repository. +At this point, the template is static. +It doesn't render any dynamic data from the repository. diff --git a/docs/tutorials/beginner_tutorial/4_display_single_content_item.md b/docs/tutorials/beginner_tutorial/4_display_single_content_item.md index d51ae5c28b..801fb8c8cb 100644 --- a/docs/tutorials/beginner_tutorial/4_display_single_content_item.md +++ b/docs/tutorials/beginner_tutorial/4_display_single_content_item.md @@ -4,7 +4,7 @@ description: Learn how to render content details with a custom template. # Step 4 — Display a single content item -You'll render a list of all Rides here in the next step. +You render a list of all Rides here in the next step. But before that, you can use the existing page layout to render the content of a single Ride. ### Create the Ride view @@ -90,7 +90,7 @@ This tells the application to use this template whenever it renders the full vie ### Check the Ride full view -Because you don't have a list of Rides on the front page yet, you cannot simply click a Ride to preview it. +Because you don't have a list of Rides on the front page yet, you cannot click a Ride to preview it. But you still can see how the template works in two ways: #### Preview in the back office diff --git a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md index 9cd8d436e2..c9ce080a97 100644 --- a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md +++ b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md @@ -118,8 +118,7 @@ site: The `query_type` parameter in line 12 indicates which Query Type to use. You defined the name `Ride` in the Query Type file in the `getName` method. -Using the `pagingQueryAction` of the built-in `ibexa_query` controller (line 6) -enables you to automatically get paginated results. +Using the `pagingQueryAction` of the built-in `ibexa_query` controller (line 6) enables you to automatically get paginated results. You can set the limit of results per page in the `limit` parameter. ### View types diff --git a/docs/tutorials/beginner_tutorial/6_improve_configuration.md b/docs/tutorials/beginner_tutorial/6_improve_configuration.md index 323a5b94c3..4de4a52763 100644 --- a/docs/tutorials/beginner_tutorial/6_improve_configuration.md +++ b/docs/tutorials/beginner_tutorial/6_improve_configuration.md @@ -6,7 +6,8 @@ description: See how you can manage Ibexa DXP configuration files. ## Define image variations -Image variations are different versions of the same image. You can use them to scale images, crop them, add effects, etc. +Image variations are different versions of the same image. +You can use them to scale images, crop them, add effects, etc. So far the images in the ride list are fitted to the templates automatically, and the result doesn't look good. Now you can create a variation to specify how you want the images to look in detail. @@ -24,7 +25,8 @@ ibexa: - {name: geometry/scaledownonly, params: [140, 100]} ``` -Next, modify the templates to use these variations. Variation names are provided as parameters when rendering the image content. +Next, modify the templates to use these variations. +Variation names are provided as parameters when rendering the image content. In `templates/line/rides.html.twig` add the `'alias': 'ride_list'` parameter in the following way, in lines 8-10: @@ -40,17 +42,20 @@ In `templates/line/rides.html.twig` add the `'alias': 'ride_list'` parameter in This ensures that the photo displayed next to each Ride in the list is scaled down properly with proportions retained. -Clear cache and refresh the front page. Photos should now have a regular size and fit in the table. +Clear cache and refresh the front page. +Photos should now have a regular size and fit in the table. ![Ride list with proper image variations](bike_tutorial_ride_list.png) ## Separate view configuration -In a larger site there are many elements that need configuration. To keep it more organized, you can split parts of configuration into separate files. +In a larger site there are many elements that need configuration. +To keep it more organized, you can split parts of configuration into separate files. -As an example, you can separate all content view configuration into its own file. Create a `config/packages/views.yaml` file. +As an example, you can separate all content view configuration into its own file. +Create a `config/packages/views.yaml` file. Copy everything under `content_view` from `config/packages/ibexa.yaml` and move it to the new file. -Remove the corresponding code from `ibexa.yaml`. +Remove the corresponding code from `ibexa.yaml`. The `views.yaml` file should look like this: diff --git a/docs/tutorials/beginner_tutorial/7_embed_content.md b/docs/tutorials/beginner_tutorial/7_embed_content.md index 6666dbbb87..6443e95eee 100644 --- a/docs/tutorials/beginner_tutorial/7_embed_content.md +++ b/docs/tutorials/beginner_tutorial/7_embed_content.md @@ -15,7 +15,8 @@ Now you need to add the second content type needed in the site, Landmark. Go to **Content types**, and in the **Content** group, add the Landmark content type. -A Landmark is an interesting place that Rides go through. Each Ride may be related to multiple Landmarks. +A Landmark is an interesting place that Rides go through. +Each Ride may be related to multiple Landmarks. - **Name**: Landmark - **Identifier**: landmark @@ -174,7 +175,7 @@ ibexa: ### Add the Landmark in the Ride full view -Now modify the Ride full view template to include a list of Landmarks, and the controller that you just created. +Now modify the Ride full view template to include a list of Landmarks, and the controller that you created. Add the following lines at the end of `templates/full/ride.html.twig`, before the last `
` and the closing tag `{% endblock %}`: ``` html+twig diff --git a/docs/tutorials/beginner_tutorial/8_enable_account_registration.md b/docs/tutorials/beginner_tutorial/8_enable_account_registration.md index e178f21197..7d86163b44 100644 --- a/docs/tutorials/beginner_tutorial/8_enable_account_registration.md +++ b/docs/tutorials/beginner_tutorial/8_enable_account_registration.md @@ -8,15 +8,17 @@ In this step you enable other users to create accounts on your site, access the ## Enable registration -In the main menu, go to **Admin** (gear icon) -> **Roles**, and click the **Anonymous** Role. +In the main menu, go to **Admin** (gear icon) -> **Roles**, and click the **Anonymous** role. ![Available roles](step_8_role_mgmt_screen.png) -Add the `User/Register` policy to the Anonymous User. This allows any visitor to the website to access the registration form. +Add the `User/Register` policy to the Anonymous user. +This allows any visitor to the website to access the registration form. ![Policies for the Anonymous Role](step8_admin_anonymous_policies.png) -Then go to `/register`. The registration form is unstyled, so you need to add templates to it. +Then go to `/register`. +The registration form is unstyled, so you need to add templates to it. ## Customize registration forms @@ -60,7 +62,8 @@ Create the file `templates/user/registration_form.html.twig`: ``` In line 10 you can see that another file is imported: `registration_content_form.html.twig`. -The second template renders the actual fields of the registration form. Create this file as well (as `templates/user/registration_content_form.html.twig`): +The second template renders the actual fields of the registration form. +Create this file as well (as `templates/user/registration_content_form.html.twig`): ``` html+twig {% macro display_form(form) %} @@ -166,16 +169,16 @@ Fill in the form and register a user. ## Set up Permissions Users created through the registration form are placed in the _Guest accounts_ user group. -The User you have just created has the roles assigned to this group. +The user you created has the roles assigned to this group. !!! tip - You can change the group in which new Users are placed (but you don't need to do it for this tutorial). + You can change the group in which new users are placed (but you don't need to do it for this tutorial). For more information, see [Registering new users](user_registration.md). At this point you don't want anyone who registers to be able to add content to the website. -That's why you'll create a new user group with additional permissions. -When the administrator accepts a new User, they can move them to this new group. +That's why you need to create a new user group with additional permissions. +When the administrator accepts a new user, they can move them to this new group. ### Create a user group @@ -207,9 +210,10 @@ Now add the following policies to the Contributors role. The limitations are a powerful tool for fine-tuning the permission management of the users. See [the documentation about limitations for more technical details](limitation_reference.md#content-type-group-limitation). -Once the policies are set, go to the "Assignments" tab and assign the role to the user group *Go Bike Members*. +Once the policies are set, go to the **Assignments** tab and assign the role to the user group *Go Bike Members*. -Next, go to the Users page. Select the user you have just created and move them into the *Go Bike Members* user group. +Next, go to the users page. +Select the user you created and move them into the *Go Bike Members* user group. ### Create content as a Go Bike Member diff --git a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md index a05ded89da..bb9f0891a8 100644 --- a/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md +++ b/docs/tutorials/generic_field_type/1_implement_the_point2d_value_class.md @@ -7,9 +7,7 @@ description: Learn how to create a Value class that stores the value of the fiel ## Project installation To start the tutorial, you need to make a clean [[= product_name =]] installation. -Follow the guide for your system to [install [[= product_name =]]](install_ibexa_dxp.md), -[configure a server](requirements.md), -and [start the web server](install_ibexa_dxp.md#use-phps-built-in-server). +Follow the guide for your system to [install [[= product_name =]]](install_ibexa_dxp.md), [configure a server](requirements.md), and [start the web server](install_ibexa_dxp.md#use-phps-built-in-server). Remember to install using the `dev` environment. Open your project with a clean installation and create the base directory for a new Point 2D field type in `src/FieldType/Point2D`. diff --git a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md index c2d0d1da0f..8458fd348a 100644 --- a/docs/tutorials/generic_field_type/2_define_point2d_field_type.md +++ b/docs/tutorials/generic_field_type/2_define_point2d_field_type.md @@ -14,7 +14,8 @@ For more information about the Type class of a field type, see [Type class](type ## Field type identifier First, create `src/FieldType/Point2D/Type.php`. -Add a `getFieldTypeIdentifier()` method to it. The new method returns the string that **uniquely** identifies your field type, in this case `point2d`: +Add a `getFieldTypeIdentifier()` method to it. +The new method returns the string that **uniquely** identifies your field type, in this case `point2d`: ```php [[= include_file('code_samples/field_types/2dpoint_ft/steps/step_2/Type.php') =]] diff --git a/docs/tutorials/generic_field_type/5_add_a_field.md b/docs/tutorials/generic_field_type/5_add_a_field.md index c76df827e0..2d2ba60d2e 100644 --- a/docs/tutorials/generic_field_type/5_add_a_field.md +++ b/docs/tutorials/generic_field_type/5_add_a_field.md @@ -5,7 +5,7 @@ description: Learn how to use your custom field type by adding a field to a cont # Step 5 - Add a new Point 2D field All actions in this step are done in the admin interface also called the back office. -Go to the admin interface (`/admin`) and log in with the default username: `admin` and the default password: `publish`. +Go to the admin interface (`/admin`) and log in with the default username: `admin` and the default password: `publish`. ## Add new content type @@ -34,11 +34,13 @@ Save everything and go back to the **Content/Content structure** tab. ## Create your content -In **Content structure**, select **Create content**. There, under **Content**, you should see Point 2D content type you just added. Click it to create new content. +In **Content structure**, select **Create content**. There, under **Content**, you should see Point 2D content type you added. +Click it to create new content. ![Selecting Point 2D from sidebar](menu_point2d.png) -Here, you can fill in coordinates of your point, e.g. 3, 5. Provided coordinates are used as a title for a new point. +Here, you can fill in coordinates of your point, e.g. 3, 5. +Provided coordinates are used as a title for a new point. ![Creating Point 2D](creating_new_point2d.png) diff --git a/docs/tutorials/generic_field_type/6_settings.md b/docs/tutorials/generic_field_type/6_settings.md index 6811db5e5f..9868534843 100644 --- a/docs/tutorials/generic_field_type/6_settings.md +++ b/docs/tutorials/generic_field_type/6_settings.md @@ -21,7 +21,7 @@ Open `src/FieldType/Point2D/Type.php` and add a `getSettingsSchema` method accor ## Add a format field -In this part you define and implement the edit form for your field type. +In this part you define and implement the edit form for your field type. Define a `Point2DSettingsType` class and add a `format` field in `src/Form/Type/Point2DSettingsType.php`: @@ -33,7 +33,7 @@ Define a `Point2DSettingsType` class and add a `format` field in `src/Form/Type/ Now, enable the user to add the coordinates which are validated. In `src/FieldType/Point2D/Type.php` you: - + - implement the `FieldDefinitionFormMapperInterface` interface - add a `mapFieldDefinitionForm` method at the end that defines the field settings diff --git a/docs/tutorials/generic_field_type/7_add_a_validation.md b/docs/tutorials/generic_field_type/7_add_a_validation.md index 9dcb644b72..98641327da 100644 --- a/docs/tutorials/generic_field_type/7_add_a_validation.md +++ b/docs/tutorials/generic_field_type/7_add_a_validation.md @@ -11,6 +11,6 @@ To provide basic validation that ensures both coordinates are provided, add asse // ... ``` -As a result, if a user tries to publish the Point 2D with just one value, they receive an error message. +As a result, if a user tries to publish the Point 2D with one value, they receive an error message. ![Point 2D validation](point2d_validation.png) diff --git a/docs/tutorials/generic_field_type/8_data_migration.md b/docs/tutorials/generic_field_type/8_data_migration.md index 01ff0a951f..49dcba77b7 100644 --- a/docs/tutorials/generic_field_type/8_data_migration.md +++ b/docs/tutorials/generic_field_type/8_data_migration.md @@ -4,14 +4,14 @@ description: Learn how to serialize and deserialize field data to enable sorting # Step 8 - Data migration between field type versions -Adding data migration enables you to easily change the output of the field type to fit your current needs. +Adding data migration enables you to change the output of the field type to fit your current needs. This process is important when a field type needs to be compared for sorting and searching purposes. Serialization allows changing objects to array by normalizing them, and then to the selected format by encoding them. In reverse, deserialization changes different formats into arrays by decoding and then denormalizing them into objects. For more information on Serializer Components, see [Symfony documentation]([[= symfony_doc =]]/components/serializer.html). -## Normalization +## Normalization First, you need to add support for normalization in a `src/Serializer/Point2D/ValueNormalizer.php`: @@ -22,7 +22,7 @@ First, you need to add support for normalization in a `src/Serializer/Point2D/Va ## Add Normalizer definition Next, add the `ValueNormalizer` service definition to the `config/services.yaml` with a `serializer.normalizer` tag: - + ```yaml services: [[= include_file('code_samples/field_types/2dpoint_ft/config/services.yaml', 39, 42) =]] @@ -39,7 +39,7 @@ To accept old versions of the field type you need to add support for denormaliza ## Add Denormalizer definition Next, add the `ValueDenormalizer` service definition to `config/services.yaml` with a `serializer.denormalizer` tag: - + ```yaml services: [[= include_file('code_samples/field_types/2dpoint_ft/config/services.yaml', 43, 46) =]] @@ -53,4 +53,4 @@ To change the format on the fly, you need to replace the constructor in `src/Fie [[= include_file('code_samples/field_types/2dpoint_ft/src/FieldType/Point2D/Value.php', 24, 31) =]] ``` -Now you can easily change the internal representation format of the Point 2D field type. +Now you can change the internal representation format of the Point 2D field type. diff --git a/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md b/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md index d636436282..b0db2bb8ae 100644 --- a/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md +++ b/docs/tutorials/generic_field_type/creating_a_point2d_field_type.md @@ -2,10 +2,11 @@ description: Go through a field type tutorial to learn how to create a custom field type based on the built-in Generic field type. --- -# Creating a Point 2D field type +# Creating a Point 2D field type This tutorial covers the creation and development of a custom [[= product_name =]] [field type](create_custom_generic_field_type.md). -The Generic field type is a very powerful extension point. It enables you to easily build complex solutions on a ready-to-go field type template. +The Generic field type is a powerful extension point. +It enables you to build complex solutions on a ready-to-go field type template. Field types are responsible for: @@ -25,10 +26,10 @@ This tutorial is aimed at developers who are familiar with [[= product_name =]] This tutorial shows you how to use the Generic field type as a template for a custom field type. You: -- create a custom Point 2D field type with two coordinates as input, e.g. (4,5) +- create a custom Point 2D field type with two coordinates as input, for example '4,5' - register the new field type as a service and define its template - add basic validation to your Point 2D -- add data migration to the field type so you're able to easily change its output +- add data migration to the field type so you're able to change its output ## Steps diff --git a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md index f2c76a909a..0588ab73da 100644 --- a/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md +++ b/docs/tutorials/page_and_form_tutorial/1_get_a_starter_website.md @@ -15,7 +15,8 @@ Get it by following the [Install [[= product_name =]]](install_ibexa_dxp.md) gui ## Add content types -Log in to the back office – add `/admin` to your installation's address (`/admin`) and log in using `admin` as the login and `publish` as the password. Disable the Focus mode, go to content types screen and (under the Content category) add two content types with the following settings: +Log in to the back office – add `/admin` to your installation's address (`/admin`) and log in using `admin` as the login and `publish` as the password. +Disable the Focus mode, go to content types screen and (under the content category) add two content types with the following settings: ### Dog Breed @@ -43,7 +44,8 @@ Log in to the back office – add `/admin` to your installation's address (``). You can see that it looks unfinished. (You can, however, still use the menu and look around the existing content in the website). +Go to the front page of your website (``). +You can see that it looks unfinished. +However, you can still use the menu and look around the existing content in the website. ![It's a Dog's World - Starting point](enterprise_tut_starting_point.png "It's a Dog's World - Starting point") @@ -28,14 +30,16 @@ Here you can check what content type it belongs to: it's a landing page. ![Ibexa Digital Experience Platform is a landing page](enterprise_tut_home_is_an_lp.png) The page contains one Code block and is displayed without any template. -Click Edit to enter a mode that enables you to work with Pages. -You can see that the home Page has only one zone with the block. +Click **Edit** to enter a mode that enables you to work with pages. +You can see that the home page has only one zone with the block. ![Empty Page with default layout](enterprise_tut_empty_single_block.png) -Remove the Tag block. Hover over it and select the trash icon from the menu. +Remove the Tag block. +Hover over it and select the trash icon from the menu. Click the **Field** button on the left of the top bar to switch to editing page fields. -Change the Title of the page to "Home". Then, publish the Page to update its name. +Change the Title of the page to "Home". +Then, publish the page to update its name. The design for the website you're making needs a layout with two zones: a main column and a narrower sidebar. [[= product_name_exp =]] provides only a one-zone default layout, so you need to create a new one. @@ -77,12 +81,12 @@ Create a `templates/layouts/sidebar.html.twig` file: [[= include_file('code_samples/tutorials/page_tutorial/templates/layouts/sidebar.html.twig') =]] ``` -The above template creates two columns and defines their widths. Each column is at the same time a zone, and each zone renders the blocks that it contains. +The above template creates two columns and defines their widths. +Each column is at the same time a zone, and each zone renders the blocks that it contains. !!! tip - In sites with multiple layouts you can separate the rendering of zones into a separate `zone.html.twig` template - to avoid repeating the same code in every layout. + In sites with multiple layouts you can separate the rendering of zones into a separate `zone.html.twig` template to avoid repeating the same code in every layout. !!! note @@ -93,7 +97,8 @@ With these three elements: configuration, icon and template, the new layout is r ### Change Home Page layout -Now you can change the Home Page to use the new layout. Edit Home and in the top bar select **Switch layout**. +Now you can change the Home Page to use the new layout. +Edit Home and in the top bar select **Switch layout**. Choose the new layout called "Main section with sidebar on the right". The empty zones you defined in the template are visible in the editor. @@ -101,14 +106,15 @@ The empty zones you defined in the template are visible in the editor. !!! tip - If the new layout isn't available when editing the Page, you may need to clear the cache (using `php bin/console cache:clear`) and/or reload the app. + If the new layout isn't available when editing the page, you may need to clear the cache (using `php bin/console cache:clear`) and/or reload the app. ![Empty page with new layout](enterprise_tut_new_layout.png) -Publish the Home Page. You can notice that it still has some additional text information. -This is because the looks of a Page are controlled by two separate template files, and you have only prepared one of those. +Publish the Home page. +You can notice that it still has some additional text information. +This is because the looks of a page are controlled by two separate template files, and you have only prepared one of those. The `sidebar.html.twig` file defines how zones are organized and how content is displayed in them. -But you also need a general template file that is used for every Page, regardless of its layout. +But you also need a general template file that is used for every page, regardless of its layout. Add this new template, `templates/full/landing_page.html.twig`: @@ -116,16 +122,17 @@ Add this new template, `templates/full/landing_page.html.twig`: [[= include_file('code_samples/tutorials/page_tutorial/templates/full/landing_page.html.twig') =]] ``` -This template simply renders the page content. If there is any additional content or formatting you would like to apply to every Page, it should be placed in this template. +This template renders the page content. +If there is any additional content or formatting you would like to apply to every page, it should be placed in this template. -Now you need to tell the app to use this template to render Pages. +Now you need to tell the app to use this template to render pages. Edit the `config/packages/views.yaml` file and add the following code under the `full:` key: ``` yaml [[= include_file('code_samples/tutorials/page_tutorial/config/packages/views.yaml', 35, 39) =]] ``` -After adding this template you can check the new Page. +After adding this template you can check the new page. The part between menu and footer should be empty, because you haven't added any content to it yet. ![Empty Page](enterprise_tut_empty_page.png) diff --git a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md index d39b3e45a7..590e51df6d 100644 --- a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md +++ b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md @@ -38,11 +38,12 @@ Finally, add some styling to the block. Add the following CSS to the end of the Run `yarn encore ` to regenerate assets. -At this point you can start adding blocks to the Page. -You do it in the Page's Edit mode by dragging a block from the menu on the right to the correct zone on the page. +At this point you can start adding blocks to the page. +You do it in the page's Edit mode by dragging a block from the menu on the right to the correct zone on the page. Drag a Content List block from the menu to the left zone on the page. -Click the block and fill in the form. Here you name the block and decide what it displays. +Click the block and fill in the form. +Here you name the block and decide what it displays. Choose the "Dog Breed Catalog" folder as the Parent, select Dog Breed as the content type to be displayed, and choose a limit (3). You'll display the first three Dog Breeds from the database. @@ -60,7 +61,8 @@ Publish the page now and move on to creating another type of block. The next block is the Content Scheduler block that airs articles at predetermined times. -First, add a configuration that points to the layout. Go to `config/packages/ibexa_fieldtype_page.yaml` again and add the following code under `blocks` on the same level as the `contentlist` key: +First, add a configuration that points to the layout. +Go to `config/packages/ibexa_fieldtype_page.yaml` again and add the following code under `blocks` on the same level as the `contentlist` key: ``` yaml [[= include_file('code_samples/tutorials/page_tutorial/config/packages/ibexa_fieldtype_page.yaml', 19, 24) =]] @@ -74,8 +76,8 @@ Create the new file `templates/blocks/schedule/featured.html.twig`: ``` When you look at the template, you can see three blocks, each of which render the content items using the `featured` view (line 11). -So far you only have templates for `full` view for Articles. This means you need to create a `featured` view template, -otherwise you get an error when trying to add Content to the block. +So far you only have templates for `full` view for Articles. +This means you need to create a `featured` view template, otherwise you get an error when trying to add content to the block. You need to modify the `config/packages/views.yaml` file to indicate when to use the template. Add the following code to this file, on the same level as the `full` key: @@ -97,7 +99,8 @@ Add it in `config/packages/image_variations.yaml` under the `image_variations` k [[= include_file('code_samples/tutorials/page_tutorial/config/packages/image_variations.yaml', 18, 22) =]] ``` -The Block is already operational, but first update the stylesheet. Add the following CSS at the end of the `assets/css/style.css` file: +The Block is already operational, but first update the stylesheet. +Add the following CSS at the end of the `assets/css/style.css` file: ``` css [[= include_file('code_samples/tutorials/page_tutorial/assets/css/style.css', 177, 207) =]] @@ -105,13 +108,13 @@ The Block is already operational, but first update the stylesheet. Add the follo Run `yarn encore ` to regenerate assets. -At this point you can add a new Content Scheduler block to your Page and fill it with content to see how it works. +At this point you can add a new Content Scheduler block to your page and fill it with content to see how it works. !!! tip If you don't see the featured block template, you may need to clear the cache (using `php bin/console cache:clear`) and/or reload the app. -Go back to editing the Home Page and drag a Content Scheduler block from the pane on the right to the main zone in the layout, above the Content List block. +Go back to editing the Home page and drag a Content Scheduler block from the pane on the right to the main zone in the layout, above the Content List block. Select the block and click the Block Settings icon. Set the Limit to three and click Select Content. @@ -126,7 +129,7 @@ This article is listed in the queue. ![Content Scheduler with scheduled content](enterprise_tut_choosing_airtime.png) -Publish the Page. +Publish the page. Now open the Timeline at the top of the screen. You can move the slider to different times and preview what the Content Scheduler block looks like at different hours. diff --git a/docs/tutorials/page_and_form_tutorial/4_create_a_custom_block.md b/docs/tutorials/page_and_form_tutorial/4_create_a_custom_block.md index 852661c582..8647d1e1b7 100644 --- a/docs/tutorials/page_and_form_tutorial/4_create_a_custom_block.md +++ b/docs/tutorials/page_and_form_tutorial/4_create_a_custom_block.md @@ -23,7 +23,8 @@ In `config/packages/ibexa_fieldtype_page.yaml` add the following block under the [[= include_file('code_samples/tutorials/page_tutorial/config/packages/ibexa_fieldtype_page.yaml', 24, 42) =]] ``` -This configuration defines one attribute, `parent`. Use it to select the folder containing tips. +This configuration defines one attribute, `parent`. +Use it to select the folder containing tips. ### Block template @@ -35,7 +36,8 @@ You also need to create the block template, `templates/blocks/random/default.ht ### Block listener -Block listener provides the logic for the block. It's contained in `src/Event/RandomBlockListener.php`: +Block listener provides the logic for the block. +It's contained in `src/Event/RandomBlockListener.php`: ``` php [[= include_file('code_samples/tutorials/page_tutorial/src/Event/RandomBlockListener.php') =]] @@ -43,8 +45,10 @@ Block listener provides the logic for the block. It's contained in `src/Event/Ra At this point the new custom block is ready to be used. -You're left with the last cosmetic changes. First, the new Block has a broken icon in the Elements menu in Page mode. -This is because you haven't provided this icon yet. If you look back to the YAML configuration, you can see the icon file defined as `random_block.svg` (line 4). Download [the provided file](https://github.com/ibexa/documentation-developer/blob/master/code_samples/tutorials/page_tutorial_starting_point/public/assets/images/blocks/random_block.svg) and place it in `public/assets/images/blocks`. +You're left with the last cosmetic changes. +First, the new Block has a broken icon in the Elements menu in page mode. +This is because you haven't provided this icon yet. +If you look back to the YAML configuration, you can see the icon file defined as `random_block.svg` (line 4). Download [the provided file](https://github.com/ibexa/documentation-developer/blob/master/code_samples/tutorials/page_tutorial_starting_point/public/assets/images/blocks/random_block.svg) and place it in `public/assets/images/blocks`. Finally, add some styling for the new block. Add the following to the end of the `assets/css/style.css` file: @@ -54,10 +58,12 @@ Finally, add some styling for the new block. Add the following to the end of the Run `yarn encore ` to regenerate assets. -Go back to editing the Front Page. Drag a Random Block from the Elements menu on the right to the Page's side column. +Go back to editing the Front page. +Drag a Random Block from the Elements menu on the right to the page's side column. Access the block's settings and choose the "All Tips" folder from the menu. Save and publish all the changes. -Refresh the home page. The Tip of the Day block displays a random Tip from the "Tips" folder. +Refresh the home page. +The Tip of the Day block displays a random Tip from the "Tips" folder. Refresh the page a few more times and you can see the tip change randomly. ![Random Block with a Tip](enterprise_tut_random_block.png "Random Block with a Tip") diff --git a/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md b/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md index 5f656f4f60..1c7eb3b12d 100644 --- a/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md +++ b/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md @@ -8,7 +8,7 @@ edition: experience The final step of this tutorial assists you in adding to the home page a Form block for signing up to a newsletter. [[% include 'snippets/forms_caution.md' %]] - + ### Add a Form block Start with creating a Form content item. @@ -31,7 +31,7 @@ The configuration should look like this: ![Adding fields to Newsletter Form](enterprise_tut_form_creation.png "Adding fields to Newsletter Form") When you add all the fields, save the form and click **Publish**. -Now you can edit the Front Page and add a Form block below the Random block. +Now you can edit the front page and add a Form block below the Random block. Edit the block and select the form you created. Click **Submit**. The Page should refresh with the Form block. @@ -59,7 +59,7 @@ Add the following configuration under the `blocks` key at the same level as othe ``` Now you have to apply the template to the block. -Go back to editing the Page. +Go back to editing the page. Edit the Form block again. In the **Design** tab, select the **Newsletter Form View** and click **Submit**. @@ -76,14 +76,14 @@ Create a `form_field.html.twig` file in `templates/fields/`: [[= include_file('code_samples/tutorials/page_tutorial/templates/fields/form_field.html.twig') =]] ``` -Next, assign the template to the Page. +Next, assign the template to the page. In `config/packages/views.yaml`, at the same level as `pagelayout`, add: ``` yaml [[= include_file('code_samples/tutorials/page_tutorial/config/packages/views.yaml', 7, 9) =]] ``` -Clear the cache by running `bin/console cache:clear` and refresh the Page to see the results. +Clear the cache by running `bin/console cache:clear` and refresh the page to see the results. ### Configure the Form field @@ -113,22 +113,23 @@ Your newsletter form block is ready. ![Newsletter Form Block](enterprise_tut_final_form.png "Newsletter Form Block") -Refresh the Page and enter a couple of mock submissions. +Refresh the page and enter a couple of mock submissions. ### Manage the submissions You can view all submissions in the back office. -Go to **Forms** page. From the content tree, select the Form and click the **Submissions** tab. +Go to **Forms** page. +From the content tree, select the Form and click the **Submissions** tab. There, after selecting submission(s), click **Download submissions** or **Delete submission**. To see details about a submission, click the view icon. ![Collect Form Submissions](enterprise_tut_form_collect_sub.png "Collect Form Submissions") -For more details, see [viewing form results](https://doc.ibexa.co/projects/userguide/en/latest/content_management/work_with_forms/#view-results). +For more information, see [viewing form results](https://doc.ibexa.co/projects/userguide/en/latest/content_management/work_with_forms/#view-results). ## Congratulations! -You have finished the tutorial and created your first customized Page. +You have finished the tutorial and created your first customized page. You have learned how to: diff --git a/docs/users/customer_groups.md b/docs/users/customer_groups.md index 4fd317c72e..fb7ca8e0d9 100644 --- a/docs/users/customer_groups.md +++ b/docs/users/customer_groups.md @@ -17,7 +17,6 @@ For example, you can offer a 10% discount for all products in the catalog to use ## Enabling customer groups -To enable using customer groups, you need to modify the user content type's definition -by adding a [customer group field](customergroupfield.md). +To enable using customer groups, you need to modify the user content type's definition by adding a [customer group field](customergroupfield.md). With this field you can add a user to any of the predefined customer groups. diff --git a/docs/users/oauth_client.md b/docs/users/oauth_client.md index 1f072f5e19..294f73bede 100644 --- a/docs/users/oauth_client.md +++ b/docs/users/oauth_client.md @@ -8,8 +8,7 @@ You can use OAuth2 to securely authenticate users with external Authorization Se ![OAuth2 Client](img/oauth2-client.png) -[[= product_name =]] uses an integration with [`knpuniversity/oauth2-client-bundle`](https://github.com/knpuniversity/oauth2-client-bundle) -to provide OAuth2 authentication. +[[= product_name =]] uses an integration with [`knpuniversity/oauth2-client-bundle`](https://github.com/knpuniversity/oauth2-client-bundle) to provide OAuth2 authentication. ## Configure OAuth2 client diff --git a/docs/users/oauth_server.md b/docs/users/oauth_server.md index bb1a482d7c..a76420fbf9 100644 --- a/docs/users/oauth_server.md +++ b/docs/users/oauth_server.md @@ -105,8 +105,7 @@ security: ## Resource Server configuration -To allow resource routes to be accessible through OAuth authorization, -you must define a firewall by using `Ibexa\OAuth2Server\Security\Guard\OAuth2Authenticator`. +To allow resource routes to be accessible through OAuth authorization, you must define a firewall by using `Ibexa\OAuth2Server\Security\Guard\OAuth2Authenticator`. The following firewall example allows the REST API to be accessed as an OAuth resource. It must be placed before the firewall with a less restrictive pattern like `ibexa_front`. @@ -159,8 +158,7 @@ php bin/console league:oauth2-server:update-client example-oauth2-client \ --add-redirect-uri=https://example.com/another-oauth2-callback ``` -Other commands let you list all the configured clients (`league:oauth2-server:list-clients`) -or delete a client (`league:oauth2-server:delete-client`). +Other commands let you list all the configured clients (`league:oauth2-server:list-clients`) or delete a client (`league:oauth2-server:delete-client`). !!! note diff --git a/docs/users/passwords.md b/docs/users/passwords.md index a74cc073cc..c257ea1d76 100644 --- a/docs/users/passwords.md +++ b/docs/users/passwords.md @@ -108,7 +108,8 @@ To do this, in the **User account (ezuser)** field definition, select "Password ![Protection against using breached passwords](password_breached.png) This rule checks the password against known password dumps by using the https://haveibeenpwned.com/ API. -It doesn't check existing passwords, so it won't block login for anyone. It applies only to new passwords when users change them. +It doesn't check existing passwords, so it won't block login for anyone. +It applies only to new passwords when users change them. !!! note diff --git a/docs/users/user_authentication.md b/docs/users/user_authentication.md index 3ecfe1f4f9..554ad27c94 100644 --- a/docs/users/user_authentication.md +++ b/docs/users/user_authentication.md @@ -7,7 +7,7 @@ description: Customize user authentication. ## Authenticate user with multiple user providers Symfony provides native support for [multiple user providers]([[= symfony_doc =]]/security/multiple_user_providers.html). -This makes it easier to integrate any kind of login handlers, including SSO and existing third party bundles (e.g. [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), etc.). +This makes it easier to integrate any kind of login handlers, including SSO and existing third party bundles (for example, [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), etc.). However, to be able to use *external* user providers with [[= product_name =]], a valid Platform user needs to be injected into the repository. This is mainly for the kernel to be able to manage content-related permissions (but not limited to this). diff --git a/docs/users/user_management_guide.md b/docs/users/user_management_guide.md index 03fa21ada1..1be65c1943 100644 --- a/docs/users/user_management_guide.md +++ b/docs/users/user_management_guide.md @@ -18,7 +18,7 @@ User management is available in all [[= product_name =]] versions. ## How does user management work -[[= product_name =]] simplifies user management with an intuitive and powerful system of accounts, Roles, Permissions, groups, and Segments. +[[= product_name =]] simplifies user management with an intuitive and powerful system of accounts, Roles, Permissions, groups, and segments. You can find all user groups and users in the **Admin** panel by selecting **Users**. Here, you can manage users, their relations, roles, and policies. @@ -42,9 +42,7 @@ Here's how it works: ## Capabilities -The detailed capabilities of [[= product_name_base =]] User Management, -which provide organizations with the tools they need to deliver personalized, secure, -and efficient user experiences while ensuring that user access and content delivery align with their business goals and strategies. +The detailed capabilities of [[= product_name_base =]] user management, which provide organizations with the tools they need to deliver personalized, secure, and efficient user experiences while ensuring that user access and content delivery align with their business goals and strategies. ### User roles and permissions @@ -53,7 +51,7 @@ Furthermore, you can create user groups to simplify Permission management. Assign multiple users to a group to ensure consistency and ease of access control. This helps maintain effortless security and control. -To help you understand further the role each element serves, here's a brief summary: +To help you understand further the role each element serves, here's a brief summary: - Role - represents a collection of Permissions that can be assigned to users or user groups. Roles streamline permission management by grouping related Permissions together. - Permission - defines a specific action or access level that can be granted or denied within the system. @@ -62,7 +60,8 @@ Policies allow for fine-grained control of access based on various factors, such ### Custom policies -[Tailor user access control](custom_policies.md) to your unique requirements using custom policies. Define complex rules and access criteria for different users or groups. +[Tailor user access control](custom_policies.md) to your unique requirements using custom policies. +Define complex rules and access criteria for different users or groups. ### Limitations @@ -90,9 +89,9 @@ Track the status of invitations, including when they were sent, whether they wer ### User segmentation and personalization [[= product_name_base =]]'s segmentation and personalization features allow organizations to deliver customized user experiences. -Track user behavior, such as page views, search queries, and interactions, to create Segments and Segment Groups for users who share similar behaviors. +Track user behavior, such as page views, search queries, and interactions, to create segments and segment groups for users who share similar behaviors. -![Segment Groups](../administration/img/admin_panel_segment_groups.png) +![Segment groups](../administration/img/admin_panel_segment_groups.png) Possible uses: diff --git a/docs/users/user_registration.md b/docs/users/user_registration.md index 6bc58f7d0f..c67fba0cbe 100644 --- a/docs/users/user_registration.md +++ b/docs/users/user_registration.md @@ -4,7 +4,8 @@ description: Register new users. # Register new users -You can allow your users to create accounts by employing the `/register` route. This route leads to a registration form that, when filled in, creates a new user content item in the repository. +You can allow your users to create accounts by employing the `/register` route. +This route leads to a registration form that, when filled in, creates a new user content item in the repository. ## User types @@ -22,7 +23,8 @@ ibexa: ## User groups -By default, new users generated in this way are placed in the Guest accounts group. You can select a different default group in the following section of configuration: +By default, new users generated in this way are placed in the Guest accounts group. +You can select a different default group in the following section of configuration: ``` yaml ibexa: diff --git a/docs/users/users.md b/docs/users/users.md index f5cf37ba11..1198096121 100644 --- a/docs/users/users.md +++ b/docs/users/users.md @@ -5,8 +5,7 @@ page_type: landing_page # Users -Users in [[= product_name =]] refer to all kinds of user accounts: administrators, editors, -managers or shop customers. +Users in [[= product_name =]] refer to all kinds of user accounts: administrators, editors, managers or shop customers. All such user accounts have the same underlying mechanism and enable you to control access to te application, both the back office and the website front, by using the [permission system](permissions.md). ## Invite nad manage users From 447a3f5852e5f7522dbc8804f1b998fec1ddf1ae Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 08:58:14 +0200 Subject: [PATCH 21/77] Tabs fixes --- docs/administration/admin_panel/users_admin_panel.md | 2 +- docs/administration/project_organization/bundles.md | 2 +- docs/content_management/forms/form_builder_guide.md | 2 +- .../rich_text/create_custom_richtext_block.md | 2 +- docs/content_management/url_management/url_management.md | 4 ++-- docs/getting_started/first_steps.md | 2 +- .../clustering/clustering_with_aws_s3.md | 2 +- docs/permissions/policies.md | 2 +- docs/release_notes/ez_platform_v1.9.0.md | 2 +- docs/release_notes/ez_platform_v2.3.md | 4 ++-- docs/release_notes/ibexa_dxp_v4.3.md | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/administration/admin_panel/users_admin_panel.md b/docs/administration/admin_panel/users_admin_panel.md index 60ba4141f6..9190dc32a8 100644 --- a/docs/administration/admin_panel/users_admin_panel.md +++ b/docs/administration/admin_panel/users_admin_panel.md @@ -1,5 +1,5 @@ --- -description: You can access all users and user groups in the users tab. +description: You can access all users and user groups in the Users tab. --- # Users diff --git a/docs/administration/project_organization/bundles.md b/docs/administration/project_organization/bundles.md index 0860c4aec6..7c8986ca5a 100644 --- a/docs/administration/project_organization/bundles.md +++ b/docs/administration/project_organization/bundles.md @@ -72,7 +72,7 @@ To remove a bundle (either one you created yourself, or an out-of-the-box one th |ibexa/oss|Core packages| |ibexa/content-tree|content tree functionality| |ibexa/connect|[[[= product_name_connect =]]](https://doc.ibexa.co/projects/connect/en/latest/)| -|ibexa/calendar|Calendar tab with a calendar widget| +|ibexa/calendar|**Calendar** tab with a calendar widget| |ibexa/connector-dam|Connector for DAM (Digital Asset Management) systems| |ibexa/elasticsearch|Integration with Elasticsearch search engine| |ibexa/fastly|Fastly support for `http-cache`, for use on Platform.sh or standalone| diff --git a/docs/content_management/forms/form_builder_guide.md b/docs/content_management/forms/form_builder_guide.md index aad4fe1e29..03e7488740 100644 --- a/docs/content_management/forms/form_builder_guide.md +++ b/docs/content_management/forms/form_builder_guide.md @@ -137,5 +137,5 @@ This allows you to create forms that fit your needs. ### Analytic tool -All the submissions can are visible in Submissions tab. +All the submissions can are visible in **Submissions** tab. You can download them as a .CSV file for additional analysis. \ No newline at end of file diff --git a/docs/content_management/rich_text/create_custom_richtext_block.md b/docs/content_management/rich_text/create_custom_richtext_block.md index 85f7c26cfe..b61ca8bd76 100644 --- a/docs/content_management/rich_text/create_custom_richtext_block.md +++ b/docs/content_management/rich_text/create_custom_richtext_block.md @@ -71,7 +71,7 @@ services: You have successfully created a custom RichText block. -You can now add your block in the Site tab. +You can now add your block in the **Site** tab. ![RichText block](extending_richtext_block.png) diff --git a/docs/content_management/url_management/url_management.md b/docs/content_management/url_management/url_management.md index bd46311251..3f19b13aba 100644 --- a/docs/content_management/url_management/url_management.md +++ b/docs/content_management/url_management/url_management.md @@ -12,7 +12,7 @@ Configure URL aliases to have human-readable URL addresses throughout your syste When developing a site, users can enter links to external websites in either RichText or URL fields. Each such link is then displayed in the URL table. You can view and update all external links that exist within the site, without having to modify and re-publish the individual content items. -The Link manager tab contains all the information about each link, including its status (valid or invalid) and the time the system last attempted to validate the URL address. +The **Link manager** tab contains all the information about each link, including its status (valid or invalid) and the time the system last attempted to validate the URL address. Click an entry in the list to display its details and check which content items use this link. Edit the entry to update the URL address in all the occurrences throughout the website. @@ -237,7 +237,7 @@ ibexa: ### Configuring URL wildcards in the back office -The URL wildcards tab contains all the information about each URL wildcard. You can delete or modify existing entries, or create new ones. +The **URL wildcards** tab contains all the information about each URL wildcard. You can delete or modify existing entries, or create new ones. !!! note diff --git a/docs/getting_started/first_steps.md b/docs/getting_started/first_steps.md index 7c7627a59f..ce0c9f4939 100644 --- a/docs/getting_started/first_steps.md +++ b/docs/getting_started/first_steps.md @@ -237,7 +237,7 @@ Call the group "Bloggers". ![Adding limitations to a policy](first-steps-policy-limitations.png) -6\. In the Assignments tab assign the "Blogger" role to the "Bloggers" group. +6\. In the **Assignments** tab assign the "Blogger" role to the "Bloggers" group. ![Assigning a role](first-steps-assign-roles.png) diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md index d4c8f63fdc..8ca764d9b6 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md @@ -22,7 +22,7 @@ The example below uses EU (Ireland): `eu-west-1` See . 1. Then create a group and assign the user to the group. 1. Assign policies to the group. The `AmazonS3FullAccess` policy gives read/write access to your bucket. -1. Still in the IAM console, view the user you created. Click the "Security credentials" tab. +1. Still in the IAM console, view the user you created. Click the **Security credentials** tab. 1. Click "Create access key" and make note of the "Access key ID" and the "Secret access key". The secret key cannot be retrieved again after the key has been created, so don't lose it. (However, you can create new keys if needed.) diff --git a/docs/permissions/policies.md b/docs/permissions/policies.md index 1071ba60e3..863def3208 100644 --- a/docs/permissions/policies.md +++ b/docs/permissions/policies.md @@ -63,7 +63,7 @@ which define, which parts of the application or website the user has access to. | `setup` | `administrate` | access Admin | | | `install` | unused | | | `setup` | unused | -| | `system_info` | view the System Information tab in Admin | +| | `system_info` | view the **System Information** tab in Admin | #### Sites [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] diff --git a/docs/release_notes/ez_platform_v1.9.0.md b/docs/release_notes/ez_platform_v1.9.0.md index 7ff62bd851..ddcfd175be 100644 --- a/docs/release_notes/ez_platform_v1.9.0.md +++ b/docs/release_notes/ez_platform_v1.9.0.md @@ -26,7 +26,7 @@ In version 1.8 we introduced a new Content Browser in the Universal Discovery Wi #### Miscellaneous -- The Details tab in content view now provides information about the Section the content item belongs to. +- The **Details** tab in content view now provides information about the Section the content item belongs to. ![Section details in Details tab](section-details.png "Section details in Details tab") diff --git a/docs/release_notes/ez_platform_v2.3.md b/docs/release_notes/ez_platform_v2.3.md index 342bd016c7..12d45c8592 100644 --- a/docs/release_notes/ez_platform_v2.3.md +++ b/docs/release_notes/ez_platform_v2.3.md @@ -16,9 +16,9 @@ You can now schedule content on a Page to become visible at a specific time in the future. - To do this you can use the Schedule tab in any block's configuration or a special Content Scheduler block. + To do this you can use the **Schedule** tab in any block's configuration or a special Content Scheduler block. - In the Schedule tab you can define when any block becomes visible and when it disappears from a Page. + In the **Schedule** tab you can define when any block becomes visible and when it disappears from a Page. ![Schedule tab](2.3_schedule_tab.png) diff --git a/docs/release_notes/ibexa_dxp_v4.3.md b/docs/release_notes/ibexa_dxp_v4.3.md index 3fad23ff6f..122023c7aa 100644 --- a/docs/release_notes/ibexa_dxp_v4.3.md +++ b/docs/release_notes/ibexa_dxp_v4.3.md @@ -67,7 +67,7 @@ You can now move assets between collections by using drag and drop. ![Moving assets between collection with drag and drop](img/4.3_collection_dnd.png) -From product's Completeness tab you can now jump directly to editing the product prices in all configured currencies. +From product's **Completeness** tab you can now jump directly to editing the product prices in all configured currencies. ![Editing product price from Completeness tab](img/4.3_edit_product_price.png) From 089c485746bd1a4981c1dcea6e36341bad745e0c Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 09:05:01 +0200 Subject: [PATCH 22/77] 'Will' fixes --- docs/getting_started/install_ibexa_dxp.md | 2 +- docs/getting_started/requirements.md | 6 +++--- .../cache/http_cache/content_aware_cache.md | 2 +- .../cache/persistence_cache.md | 4 ++-- docs/infrastructure_and_maintenance/devops.md | 3 ++- .../page_and_form_tutorial/2_prepare_the_landing_page.md | 2 +- .../page_and_form_tutorial/3_use_existing_blocks.md | 4 ++-- docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md | 4 ++-- docs/update_and_migration/from_2.5/adapt_code_to_v3.md | 2 +- .../migrating_from_ez_publish_platform.md | 4 ++-- 10 files changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md index bdcf288daf..04f286637c 100644 --- a/docs/getting_started/install_ibexa_dxp.md +++ b/docs/getting_started/install_ibexa_dxp.md @@ -68,7 +68,7 @@ Log in to your service portal on [support.ibexa.co](https://support.ibexa.co/), 1. Select **Create token** (this requires the **Portal administrator** access level). 2. Fill in a label describing the use of the token. This allows you to revoke access later. -3. Save the password, **you will not get access to it again**! +3. Save the password, **you aren't able to access it again**. !!! tip "Save the authentication token in `auth.json` to avoid re-typing it" diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index a2918a7623..d3c62669a4 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -335,7 +335,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "[[= product_name =]] v4.6" - [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -344,7 +344,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "[[= product_name =]] v3.3" - [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -353,7 +353,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "eZ Platform v2.5" - eZ Platform is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you'll need; a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + eZ Platform is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index b73f3ff0e8..35b50adfd5 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -589,7 +589,7 @@ This isn't a problem as long as the controller doesn't return values from any Co The `Set-Cookie` here may cause the problem. A ESI fragment should never set a cookie because: - Clients only receive the headers set in the "mother" document (the headers in the "/" response in this case). -- Only the content of ESIs responses is returned to the client. **No headers set in the ESI response will ever reach the client**. ESI headers are only seen by the HTTP cache. +- Only the content of ESIs responses is returned to the client. **No headers set in the ESI response ever reach the client**. ESI headers are only seen by the HTTP cache. - Symfony reverse proxy doesn't support ESIs at all, and any ESI calls (`render_esi()`) are implicitly replaced by sub-requests (`render()`). So any `Set-Cookie` **is** sent to the client when using Symfony reverse proxy. diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 28e7cefd48..30cbe58757 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -156,7 +156,7 @@ Depending on the number of lookups and latency to cache server this might affect #### Adjusting configuration -Out of the box in `config/packages/cache_pool/cache.redis.yaml` you'll find a default example that can be used. +Out of the box in `config/packages/cache_pool/cache.redis.yaml` you can find a default example that can be used. !!! note "[[= product_name_cloud =]]" @@ -234,7 +234,7 @@ There is one Memcached adapter available out of the box. #### Adjusting configuration -Out of the box in `config/packages/cache_pool/cache.memcached.yaml` you'll find a default example that can be used. +Out of the box in `config/packages/cache_pool/cache.memcached.yaml` you can find a default example that can be used. !!! note "[[= product_name_cloud =]]" diff --git a/docs/infrastructure_and_maintenance/devops.md b/docs/infrastructure_and_maintenance/devops.md index e58ed5b42b..1dc63ea399 100644 --- a/docs/infrastructure_and_maintenance/devops.md +++ b/docs/infrastructure_and_maintenance/devops.md @@ -26,7 +26,8 @@ php bin/console --env=prod cache:clear -h ### Clearing content cache on a cluster setup -For a [cluster](clustering.md) setup, the content cache ([HTTP cache](http_cache.md) and [Persistence cache](persistence_cache.md)) must be set up to be shared among the servers. And while all relevant cache is cleared for you on Repository changes when using the APIs, there might be times where you'll need to clear cache manually:  +For a [cluster](clustering.md) setup, the content cache ([HTTP cache](http_cache.md) and [Persistence cache](persistence_cache.md)) must be set up to be shared among the servers. +While all relevant cache is cleared for you on repository changes when using the APIs, there might be times where you need to clear cache manually:  - Varnish: [Cache purge](reverse_proxy.md#using-varnish-or-fastly) - Persistence Cache: [Using Cache service](persistence_cache.md#using-cache-service) diff --git a/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md b/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md index 8a39e27b30..81065c69fe 100644 --- a/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md +++ b/docs/tutorials/page_and_form_tutorial/2_prepare_the_landing_page.md @@ -5,7 +5,7 @@ edition: experience # Step 2 — Prepare the Page -In this step you'll prepare and configure your front page, together with its layout and templates. +In this step you can prepare and configure your front page, together with its layout and templates. ## Create Page layout diff --git a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md index 590e51df6d..42f2640a35 100644 --- a/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md +++ b/docs/tutorials/page_and_form_tutorial/3_use_existing_blocks.md @@ -5,7 +5,7 @@ edition: experience # Step 3 — Use existing blocks -In this step you'll add a Content List block and a Content Scheduler block and customize them. +In this step you can add a Content List block and a Content Scheduler block and customize them. ### Add a Content List block @@ -45,7 +45,7 @@ Drag a Content List block from the menu to the left zone on the page. Click the block and fill in the form. Here you name the block and decide what it displays. Choose the "Dog Breed Catalog" folder as the Parent, select Dog Breed as the content type to be displayed, and choose a limit (3). -You'll display the first three Dog Breeds from the database. +Display the first three Dog Breeds from the database. ![Window with Content List options](enterprise_tut_content_list_window.png) diff --git a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md index bdab60fd44..4a21005431 100644 --- a/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md +++ b/docs/update_and_migration/from_1.x_2.x/update_db_to_2.5.md @@ -114,13 +114,13 @@ See [documentation](render_page.md#render-a-layout) for an example on usage of t Landing page blocks (from v2.1 and earlier) were defined using a class implementing `EzSystems\LandingPageFieldTypeBundle\FieldType\LandingPage\Model\AbstractBlockType`. In Page Builder (from v2.2 onwards), this interface is no longer present. Instead the logic of your block must be implemented in a [Listener](page_blocks.md#block-events). -Typically, what you previously would do in `getTemplateParameters()`, you'll now do in the `onBlockPreRender()` event handler. +Typically, what you previously would do in `getTemplateParameters()`, you now do in the `onBlockPreRender()` event handler. The definition of block parameters has to be moved from `createBlockDefinition()` to the [YAML configuration](create_custom_page_block.md) for your custom blocks. For more information about how custom blocks are implemented in Page Builder, see [Creating custom Page blocks](create_custom_page_block.md) for your custom blocks. -For the migration of blocks from landing page to Page Builder, you'll need to provide a converter for attributes of custom blocks. For simple blocks you can use `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\DefaultConverter`. +For the migration of blocks from landing page to Page Builder, you need to provide a converter for attributes of custom blocks. For simple blocks you can use `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\DefaultConverter`. Custom converters must implement the `\EzSystems\EzPlatformPageMigration\Converter\AttributeConverter\ConverterInterface` interface. `convert()` parses XML `\DOMNode $node` and return an array of `\EzSystems\EzPlatformPageFieldType\FieldType\LandingPage\Model\Attribute` objects. diff --git a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md index 09ef65e4b6..42eba7d3e4 100644 --- a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md +++ b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md @@ -29,7 +29,7 @@ This folder also contains `config/packages/ezplatform.yaml`, which contains all #### PHP code and bundle organization Since Symfony 4 `src/` code is no longer organized in bundles, `AppBundle` has been removed from the default eZ Platform install. -To adapt, you'll need to move all your PHP code, such as controllers or event listeners, to the `src` folder and use the `App` namespace for your custom code instead. +To adapt, you need to move all your PHP code, such as controllers or event listeners, to the `src` folder and use the `App` namespace for your custom code instead. !!! tip "How to make AppBundle continue to work, for now" diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index 829faadb7f..5355f4c55e 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -75,7 +75,7 @@ Adapt the command with your `vendor`, `package`, version number, and add `"–d #### 2.2.2 Install XmlText field type -While no longer bundled, the XmlText field type still exists and is needed to perform a migration from eZ Publish's XmlText to the new docbook-based format used by the RichText field type. If you plan to use Legacy Bridge for a while before migrating content, you'll also need this for rendering content with XMLText. From `` execute: +While no longer bundled, the XmlText field type still exists and is needed to perform a migration from eZ Publish's XmlText to the new docbook-based format used by the RichText field type. If you plan to use Legacy Bridge for a while before migrating content, you also need this for rendering content with XMLText. From `` execute: `composer require --no-update "ezsystems/ezplatform-xmltext-fieldtype:^1.3.0"` @@ -115,7 +115,7 @@ To move over your own custom configurations, follow the conventions below and ma !!! note "Make sure to adapt SiteAccess names" - In the default configurations in **ezplatform.yaml** you'll find existing SiteAccesses like `site`, and depending on installation perhaps a few others, all under a site group called `site\_group`. Make sure to change those to what you had in **ezpublish.yaml** to avoid issues with having to log in to your website, given user/login policy rules need to be updated if you change names of SiteAccess as part of the upgrade. + In the default configurations in **ezplatform.yaml** you can find existing SiteAccesses like `site`, and depending on installation perhaps a few others, all under a site group called `site\_group`. Make sure to change those to what you had in **ezpublish.yaml** to avoid issues with having to log in to your website, given user/login policy rules need to be updated if you change names of SiteAccess as part of the upgrade. #### 2.3.1 Image aliases From ccdc2f093128c461f571d67668cf6d49d628adc2 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 09:08:15 +0200 Subject: [PATCH 23/77] 'Won't' fixes --- docs/api/rest_api/rest_api_authentication.md | 2 +- docs/customer_management/cp_page_builder.md | 3 ++- docs/getting_started/install_with_ddev.md | 2 +- docs/getting_started/requirements.md | 2 +- docs/ibexa_products/ibexa_headless.md | 4 ++-- docs/release_notes/ez_platform_v1.11.0.md | 2 +- .../migrating_from_ez_publish_platform.md | 2 +- docs/users/passwords.md | 2 +- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/api/rest_api/rest_api_authentication.md b/docs/api/rest_api/rest_api_authentication.md index f017b6733c..9d4aa73fa5 100644 --- a/docs/api/rest_api/rest_api_authentication.md +++ b/docs/api/rest_api/rest_api_authentication.md @@ -365,7 +365,7 @@ If the installation has a dedicated host for REST, you can enable HTTP basic aut * If the back office SiteAccess matches `//admin.example.com` (through `Map\Host`, `HostElement` or `HostText`), it calls the REST API under `//admin.example.com/api/ibexa/v2`; * If the back office SiteAccess matches `//localhost/admin` (through `URIElement`, `Map\URI` or `Regex\URI`), it calls the REST API under `//localhost/api/ibexa/v2` because SiteAccess matching with REST isn't enabled at URL level. - If you enable basic authentication for `pattern: ^/api/ibexa/v2` to use it in your front office across both production and development environments, your development environment's back office won't work correctly. + If you enable basic authentication for `pattern: ^/api/ibexa/v2` to use it in your front office across both production and development environments, your development environment's back office cannot work correctly. This back office tries to access REST through the same URL as the front office. Even when logged in back office and using the [X-SiteAccess header](rest_requests.md#siteaccess), the firewall blocks access to REST as you're not logged through basic authentification. Therefore, some back office features don't work. If basic authentication is used only for REST API, it's better to have a dedicated domain even on a development environment. For example, map an `api.localhost` in your `hosts` file and set the firewall for `host: ^api\.(example\.com|localhost)$`. diff --git a/docs/customer_management/cp_page_builder.md b/docs/customer_management/cp_page_builder.md index 9e92a6550e..b91475a66a 100644 --- a/docs/customer_management/cp_page_builder.md +++ b/docs/customer_management/cp_page_builder.md @@ -171,7 +171,8 @@ If members of the Customer Group don't have sufficient permissions for any Custo !!! note - Customer Portal is only available to users that are members of the company. Even if user has all the sufficient permissions but isn't a member of a company, they won't see the Customer Portal. + Customer Portal is only available to users that are members of the company. + Even if user has all the sufficient permissions but isn't a member of a company, cannot see the Customer Portal. #### Build-in portal mapping diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index 09572891be..e0bbad763a 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -128,7 +128,7 @@ Replace `` and `` with your actual installatio ddev composer config --global http-basic.updates.ibexa.co ``` -This authentication won't persist if the project is restarted (by `ddev restart` or `ddev composer create`). You can back up the authentication file (`auth.json`) by using the following command: +This authentication doesn't persist if the project is restarted (by `ddev restart` or `ddev composer create`). You can back up the authentication file (`auth.json`) by using the following command: ```bash ddev exec "mkdir -p .ddev/homeadditions/.composer; cp ~/.composer/auth.json .ddev/homeadditions/.composer" diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index d3c62669a4..e443bdc378 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -493,7 +493,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, where you or a partner take ownership of the configuration to set up the project. Such projects are possible by means of custom integrations/configuration, - but they may generate issues that won't be covered by eZ Enterprise subscription bug fix guarantee. + but they may generate issues that aren't covered by eZ Enterprise subscription bug fix guarantee. !!! tip "Use a partner with prior experience on legacy and Platform.sh" diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md index eecedaa13d..5878661789 100644 --- a/docs/ibexa_products/ibexa_headless.md +++ b/docs/ibexa_products/ibexa_headless.md @@ -61,7 +61,7 @@ APIs summary: [[= 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. +You don't lose time to develop a theme for a provided front office before discovering it doesn'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. @@ -128,7 +128,7 @@ Like everything in the back office, the calendar is extendable: you can add an e - Product variants can rapidly be created by the automatic declination of attributes that have 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 favorite terms. -Tag organization can be handled by a supervisor who won't need to move content items around a corporate content tree. +Tag organization can be handled by a supervisor who doesn'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 diff --git a/docs/release_notes/ez_platform_v1.11.0.md b/docs/release_notes/ez_platform_v1.11.0.md index 9f1502a594..c5fba7987e 100644 --- a/docs/release_notes/ez_platform_v1.11.0.md +++ b/docs/release_notes/ez_platform_v1.11.0.md @@ -71,7 +71,7 @@ full support, maintenance, and priority security patch handling as they're used Not supported for clean/new installs, intended for use with migrations. The Legacy Bridge integration doesn't have same performance, scalability or integrated experience as pure Platform setup. There are known edge cases where for instance cache or search index - won't always be immediately updated across the two systems using the bridge, which is one of the many reasons why we recommend + cannot always be immediately updated across the two systems using the bridge, which is one of the many reasons why we recommend a pure Platform setup where that is possible. ## Full list of new features, improvements and bug fixes since v1.10.0 diff --git a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md index 5355f4c55e..360af4f6b7 100644 --- a/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md +++ b/docs/update_and_migration/migrate_to_ibexa_dxp/migrating_from_ez_publish_platform.md @@ -173,7 +173,7 @@ If you don't plan to migrate content directly to newer eZ Platform field types, !!! note - The Legacy Bridge integration doesn't have the same performance, scalability or integrated experience as a pure Platform setup. Like on eZ Publish Platform 5.x there are known edge cases where, for instance, cache or search index won't always be immediately updated across the two systems using the bridge. This is one of the many reasons why we recommend a pure Platform setup where that is possible. + The Legacy Bridge integration doesn't have the same performance, scalability or integrated experience as a pure Platform setup. Like on eZ Publish Platform 5.x there are known edge cases where, for instance, cache or search index cannot always be immediately updated across the two systems using the bridge. This is one of the many reasons why we recommend a pure Platform setup where that is possible. #### 2.5.1 Set up symlinks for legacy folders diff --git a/docs/users/passwords.md b/docs/users/passwords.md index c257ea1d76..ac8eb6e6a1 100644 --- a/docs/users/passwords.md +++ b/docs/users/passwords.md @@ -108,7 +108,7 @@ To do this, in the **User account (ezuser)** field definition, select "Password ![Protection against using breached passwords](password_breached.png) This rule checks the password against known password dumps by using the https://haveibeenpwned.com/ API. -It doesn't check existing passwords, so it won't block login for anyone. +It doesn't check existing passwords, so it doesn't block login for anyone. It applies only to new passwords when users change them. !!! note From 9a8a1d2251894a8168508c56ecb0dc43eaf39c5a Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 09:44:48 +0200 Subject: [PATCH 24/77] 'e.g.' fixes --- .../back_office_elements/extending_thumbnails.md | 6 +++--- docs/administration/configuration/configuration.md | 2 +- .../configuration/repository_configuration.md | 4 ++-- docs/api/graphql/graphql.md | 4 ++-- docs/api/graphql/graphql_operations.md | 2 +- .../content_management/content_api/browsing_content.md | 4 ++-- .../content_management/content_api/managing_content.md | 2 +- docs/content_management/content_model.md | 2 +- .../field_types/field_type_reference/matrixfield.md | 2 +- .../field_types/field_type_reference/pagefield.md | 2 +- .../field_types/field_type_storage.md | 8 ++++---- docs/content_management/field_types/field_types.md | 4 ++-- .../field_types/form_and_template.md | 2 +- docs/content_management/field_types/type_and_value.md | 10 +++++----- docs/content_management/url_management/url_api.md | 2 +- .../url_management/url_management.md | 2 +- .../create_user_registration_form.md | 4 ++-- docs/getting_started/troubleshooting.md | 4 ++-- .../cache/http_cache/content_aware_cache.md | 2 +- .../cache/persistence_cache.md | 10 +++++----- .../clustering/clustering.md | 2 +- docs/infrastructure_and_maintenance/performance.md | 2 +- .../security/development_security.md | 2 +- docs/multisite/languages/back_office_translations.md | 2 +- docs/multisite/languages/languages.md | 2 +- .../site_factory/site_factory_configuration.md | 2 +- .../siteaccess/siteaccess_aware_configuration.md | 2 +- docs/multisite/siteaccess/siteaccess_matching.md | 4 ++-- docs/permissions/permission_overview.md | 4 ++-- docs/release_notes/ez_platform_v2.5.md | 2 +- .../solr_search_engine/configure_solr.md | 2 +- .../ismainlocation_sort_clause.md | 2 +- .../sort_clause_reference/visibility_sort_clause.md | 2 +- docs/tutorials/generic_field_type/5_add_a_field.md | 2 +- .../page_and_form_tutorial/5_create_newsletter_form.md | 2 +- docs/update_and_migration/from_2.5/adapt_code_to_v3.md | 2 +- .../from_2.5/update_code/7_update_extensions.md | 2 +- 37 files changed, 58 insertions(+), 58 deletions(-) diff --git a/docs/administration/back_office/back_office_elements/extending_thumbnails.md b/docs/administration/back_office/back_office_elements/extending_thumbnails.md index 661086ca08..7984e1ea43 100644 --- a/docs/administration/back_office/back_office_elements/extending_thumbnails.md +++ b/docs/administration/back_office/back_office_elements/extending_thumbnails.md @@ -10,7 +10,7 @@ If you don't want to use custom thumbnails, `ContentType` is used instead. ## Thumbnail mechanism The thumbnail mechanism has two layers, and each layer can have many implementations. -The mechanism checks if any of the implementations returns a field e.g. `ezimage` that has function "Can be a thumbnail" turned on. +The mechanism checks if any of the implementations returns a field, for example, `ezimage`, that has function "Can be a thumbnail" turned on. ![Can be a thumbnail setting](extending_thumbnail_can_be.png) @@ -30,7 +30,7 @@ For this layer there are following default implementations: ### Second layer Second layer of mechanism enables selection of thumbnail from a field that the first layer has found. -It searches the content type for all the fields e.g. images with function "Can be a thumbnail" turned on. +It searches the content type for all the fields, for example, images, with function "Can be a thumbnail" turned on. If there is more than one field in the content type that can be used as a thumbnail, this layer returns the first nonempty field as a thumbnail. @@ -62,7 +62,7 @@ At this point you can go to the back office and check the results. ## Other fields as thumbnails -Any field type can generate a thumbnail, e.g.: +Any field type can generate a thumbnail, for example: - DateAndTime (`ezdatetime`) - you can add a mini calendar thumbnail for Appointment content type and on the day of the appointment a clock thumbnail with a specific time when it takes place - TextBlock (`eztext`) - you can add a first letter of the text block that is inside diff --git a/docs/administration/configuration/configuration.md b/docs/administration/configuration/configuration.md index 725bf43707..9622d20ae9 100644 --- a/docs/administration/configuration/configuration.md +++ b/docs/administration/configuration/configuration.md @@ -20,7 +20,7 @@ Configuration is provided per package in the `config/packages` folder, and route `config/packages/ibexa.yaml` contains basic configuration. It stores, among others, [SiteAccess](multisite.md) information and content view config. -Other configuration is provided in respective files, e.g. `config/packages/ibexa_admin_ui.yaml`, `config/packages/ibexa_http_cache.yaml`. +Other configuration is provided in respective files, for example, `config/packages/ibexa_admin_ui.yaml`, `config/packages/ibexa_http_cache.yaml`. Configuration can be made environment-specific using separate folders for each environment. These files contain additional settings and point to the general (not environment-specific) configuration that is applied in other cases. diff --git a/docs/administration/configuration/repository_configuration.md b/docs/administration/configuration/repository_configuration.md index a25c8e6ada..f67951106a 100644 --- a/docs/administration/configuration/repository_configuration.md +++ b/docs/administration/configuration/repository_configuration.md @@ -245,11 +245,11 @@ ibexa: ``` You can override these settings if you have other content types that should be treated as users/user groups in the back office. -When viewing such content in the back office you're able to see e.g. the assigned policies. +When viewing such content in the back office you're able to see, for example, the assigned policies. ## Top-level Locations -You can change the default path for top-level Locations such as content or media in the back office, e.g.: +You can change the default path for top-level Locations such as content or media in the back office, for example: ```yaml ibexa: diff --git a/docs/api/graphql/graphql.md b/docs/api/graphql/graphql.md index 29eb0d1842..9983e33a6f 100644 --- a/docs/api/graphql/graphql.md +++ b/docs/api/graphql/graphql.md @@ -36,7 +36,7 @@ To find identifiers that aren't included in the schema, look for "Skipped schema GraphQL for [[= product_name =]] is based on the content types (including product types), content type groups, and content items defined in the repository. -For each content type the schema exposes a singular and plural field, e.g. `article` and `articles`. +For each content type the schema exposes a singular and plural field, for example, `article` and `articles`. Use the singular field to query a single content item, and the plural to get a whole `Connection` (a list of content items that supports pagination). With the queries you can inspect: @@ -52,7 +52,7 @@ You can also query content type and content type group information through the ` The repository schema, accessed through `_repository`, exposes the [[= product_name =]] repository in a manner similar to the [Public PHP API](php_api.md). -The `_repository` field also enables you to query e.g. Object states configured for the repository. +The `_repository` field also enables you to query, for example, Object states configured for the repository. ### Custom schemas diff --git a/docs/api/graphql/graphql_operations.md b/docs/api/graphql/graphql_operations.md index 96b2e54351..ff2264e3ec 100644 --- a/docs/api/graphql/graphql_operations.md +++ b/docs/api/graphql/graphql_operations.md @@ -7,7 +7,7 @@ description: Use GraphQL operations to create, update, and delete content. Operations on content in GraphQL are performed using [mutations](https://graphql.org/learn/queries/#mutations). They include creating, updating, and deleting content items. -The schema contains two mutations per content type, e.g. `createFolder` and `updateFolder`. +The schema contains two mutations per content type, for example, `createFolder`, and `updateFolder`. You can also make use of the generic `deleteContent` and `uploadFiles` mutations. ## Creating content diff --git a/docs/content_management/content_api/browsing_content.md b/docs/content_management/content_api/browsing_content.md index cc15a0428e..7e04dc9fbd 100644 --- a/docs/content_management/content_api/browsing_content.md +++ b/docs/content_management/content_api/browsing_content.md @@ -39,7 +39,7 @@ It provides you with basic content metadata such as modification and publication !!! note "Retrieving content information in a controller" - To retrieve content information in a controller, you also make use of the `ContentService`, but rendering specific elements (e.g. content information or field values) is relegated to [templates](templates.md). + To retrieve content information in a controller, you also make use of the `ContentService`, but rendering specific elements (for example, content information or field values) is relegated to [templates](templates.md). ### Locations @@ -229,4 +229,4 @@ $nameComparison = $this->comparisonService->compare($versionFrom, $versionTo)->g `getComparisonResult` returns a `ComparisonResult` object, which depends on the field type being compared. In the example of a Text Line (ezstring) field, it's an array of `StringDiff` objects. -Each diff contains a section of the field to compare (e.g. a part of a text line) and its status, which can be "unchanged", "added" or "removed". +Each diff contains a section of the field to compare (for example, a part of a text line) and its status, which can be "unchanged", "added" or "removed". diff --git a/docs/content_management/content_api/managing_content.md b/docs/content_management/content_api/managing_content.md index 65e5c16ffa..35980bb19d 100644 --- a/docs/content_management/content_api/managing_content.md +++ b/docs/content_management/content_api/managing_content.md @@ -211,7 +211,7 @@ You can process the events in a collection using the `find(Closure $predicate)`, ### Performing calendar actions -You can perform a calendar action (e.g. reschedule or unschedule calendar events) using the `CalendarServiceInterface::executeAction()` method. +You can perform a calendar action (for example, reschedule or unschedule calendar events) using the `CalendarServiceInterface::executeAction()` method. You must pass an `Ibexa\Contracts\Calendar\EventAction\EventActionContext` instance as argument. `EventActionContext` defines events on which the action is performed, and action-specific parameters, for example, a new date: diff --git a/docs/content_management/content_model.md b/docs/content_management/content_model.md index 1cbeb0d696..62b6b37fa5 100644 --- a/docs/content_management/content_model.md +++ b/docs/content_management/content_model.md @@ -63,7 +63,7 @@ It's [set per content type](content_availability.md). **`remoteId`** - a global unique ID of the content item. Accepts up to 100 characters. Cannot contain non-printable characters and control sequences (anything in ASCII range `\x00` - `\x1F`). -It's recommended to either let this value be generated by the Public PHP API as an MD5 hash, or at least to generate it as a hash (e.g. one from SHA family). +It's recommended to either let this value be generated by the Public PHP API as an MD5 hash, or at least to generate it as a hash (for example, one from SHA family). **`mainLanguageCode`** - the main language code of the content item. If the `alwaysAvailable` flag is set to true, the content item is shown in this language when the requested language doesn't exist. diff --git a/docs/content_management/field_types/field_type_reference/matrixfield.md b/docs/content_management/field_types/field_type_reference/matrixfield.md index 691e800096..927046cb2e 100644 --- a/docs/content_management/field_types/field_type_reference/matrixfield.md +++ b/docs/content_management/field_types/field_type_reference/matrixfield.md @@ -170,7 +170,7 @@ Example response: To create a Matrix field type you need to define field type and field definition identifiers. The types that are used for input are named after the Type and the field: -- `{TypeIdentifier}{FieldIdentifier}RowInput` e.g. `dish.nutritionFacts`, `event.agenda`: `DishNutritionFactsRowInput`, `EventAgendaRowInput` +- `{TypeIdentifier}{FieldIdentifier}RowInput`, for example, `dish.nutritionFacts`, `event.agenda`: `DishNutritionFactsRowInput`, `EventAgendaRowInput` The example below shows how to create a Recipe content item (belonging to a content type with a Matrix field type added) that has two fields: diff --git a/docs/content_management/field_types/field_type_reference/pagefield.md b/docs/content_management/field_types/field_type_reference/pagefield.md index 31e0874a07..ce45c39c30 100644 --- a/docs/content_management/field_types/field_type_reference/pagefield.md +++ b/docs/content_management/field_types/field_type_reference/pagefield.md @@ -34,7 +34,7 @@ For information on how to create and configure new blocks for the Page, see [Cre Page rendering takes place while editing or viewing. -When rendering a Page, its zones are passed to the layout as a `zones` array with a `blocks` array each. You can access them using twig (e.g. `{{ zones[0].id }}` ). +When rendering a Page, its zones are passed to the layout as a `zones` array with a `blocks` array each. You can access them using twig (for example, `{{ zones[0].id }}` ). Each div that's a zone should have the `data-ibexa-zone-id` attribute with zone ID as a value for a zone container. diff --git a/docs/content_management/field_types/field_type_storage.md b/docs/content_management/field_types/field_type_storage.md index 1b64fb928b..f0d3a68772 100644 --- a/docs/content_management/field_types/field_type_storage.md +++ b/docs/content_management/field_types/field_type_storage.md @@ -32,7 +32,7 @@ The Legacy storage engine uses the `ezcontentobject_attribute` table to store fi and `ezcontentclass_attribute` to store field definition values. they're both based on the same principle. -Each row represents a field or a field definition, and offers several free fields of different types, where the type can store its data e.g. +Each row represents a field or a field definition, and offers several free fields of different types, where the type can store its data. - `ezcontentobject_attribute` offers: - `data_int` @@ -88,7 +88,7 @@ The tag has the following attribute: ## Storing data externally A field type may store arbitrary data in external data sources. -External storage can be e.g. a web service, a file in the file system, another database +External storage can be, for example, a web service, a file in the file system, another database or even the [[= product_name =]] database itself (in form of a non-standard table). To store data in external storage, the field type interacts with the Persistence SPI @@ -107,7 +107,7 @@ calls one of the following methods to also access the external data: Each of the above methods (except `hasFieldData`) receives a `$context` array with information on the underlying storage and the environment. To retrieve and store data in the [[= product_name =]] data storage, -but outside of the normal structures (e.g. a custom table in an SQL database), +but outside of the normal structures (for example, a custom table in an SQL database), use [Gateway-based storage](#gateway-based-storage) with properly injected Doctrine Connection. The field type must take care on its own for being compliant with different data sources and that third parties can extend the data source support easily. @@ -120,7 +120,7 @@ The interface `Ibexa\Contracts\Core\FieldType\StorageGateway` is implemented by |Method|Description| |------|-----------| -|`setConnection()`|The registry mechanism uses this method to set the SPI storage connection (e.g. the database connection to the Legacy Storage database) into the gateway, which might be used to store external data. The connection is retrieved from the `$context` array automatically by the registry.| +|`setConnection()`|The registry mechanism uses this method to set the SPI storage connection (for example, the database connection to the Legacy Storage database) into the gateway, which might be used to store external data. The connection is retrieved from the `$context` array automatically by the registry.| The Gateway implementation itself must take care of validating that it received a usable connection. If it doesn't, it should throw a `RuntimeException`. diff --git a/docs/content_management/field_types/field_types.md b/docs/content_management/field_types/field_types.md index 46af661cff..57dbc063a2 100644 --- a/docs/content_management/field_types/field_types.md +++ b/docs/content_management/field_types/field_types.md @@ -5,7 +5,7 @@ description: Field types define the fields that a content item is built of. # Field types Field types are the smallest building blocks of content. -[[= product_name =]] comes with many [built-in field types](field_type_reference.md#available-field-types) that cover most common needs e.g. Text line, Email address, Author list, Content relation, Map location, Float, etc. +[[= product_name =]] comes with many [built-in field types](field_type_reference.md#available-field-types) that cover most common needs, for example, Text line, Email address, Author list, Content relation, Map location, Float, etc. Field types are responsible for: @@ -42,7 +42,7 @@ Below that, the field type must support the **public PHP API** implementation re - Communication with the Persistence SPI On the bottom level, a field type can additionally hook into the **Persistence SPI** to store data from a `FieldValue` in an external service. -All non-standard [[= product_name =]] database tables (e.g. `ezurl`) are treated as [external storage](field_type_storage.md#storing-data-externally). +All non-standard [[= product_name =]] database tables (for example, `ezurl`) are treated as [external storage](field_type_storage.md#storing-data-externally). The following sequence diagrams visualize the process of creating and publishing new content across all layers, especially focused on the interaction with a field type. diff --git a/docs/content_management/field_types/form_and_template.md b/docs/content_management/field_types/form_and_template.md index 5d9546206a..cfb15e8841 100644 --- a/docs/content_management/field_types/form_and_template.md +++ b/docs/content_management/field_types/form_and_template.md @@ -186,7 +186,7 @@ ibexa: For templates for previewing the field in the back office, using the design engine is recommended with `ibexa_standard_design.override_kernel_templates` set to `true`. -With the design engine you can apply a template (e.g. `Resources/views/themes/admin/content_fields.html.twig`) without any extra configuration. +With the design engine you can apply a template (for example, `Resources/views/themes/admin/content_fields.html.twig`) without any extra configuration. If you don't use the design engine, apply the following configuration: diff --git a/docs/content_management/field_types/type_and_value.md b/docs/content_management/field_types/type_and_value.md index 4088902372..7210c0d178 100644 --- a/docs/content_management/field_types/type_and_value.md +++ b/docs/content_management/field_types/type_and_value.md @@ -29,11 +29,11 @@ Since the public PHP API cannot know anything about these, their handling is del #### `getFieldTypeIdentifier()` Returns a unique identifier for the custom field type which is used to assign the type to a field definition. -By convention it should be prefixed by a unique vendor shortcut (e.g. `ibexa` for [[= product_name =]]). +By convention it should be prefixed by a unique vendor shortcut (for example, `ibexa` for [[= product_name =]]). #### `getSettingsSchema()` -This method retrieves via public PHP API a schema for the field type settings. A typical setting would be e.g. default value. The settings structure defined by this schema is stored in the `FieldDefinition`. Since it's not possible to define a generic format for such a schema, the field type is free to return any serializable data structure from this method. +This method retrieves via public PHP API a schema for the field type settings. A typical setting would be, for example, default value. The settings structure defined by this schema is stored in the `FieldDefinition`. Since it's not possible to define a generic format for such a schema, the field type is free to return any serializable data structure from this method. #### `getValidatorConfigurationSchema()` @@ -127,7 +127,7 @@ Like most API components, field types use the [Symfony service tag mechanism]([[ A service can be assigned one or several tags, with specific parameters. When the [service container](php_api.md#service-container) is compiled into a PHP file, tags are read by `CompilerPass` implementations that add extra handling for tagged services. -Each service tagged as `ibexa.field_type` is added to a [registry](https://martinfowler.com/eaaCatalog/registry.html) using the `alias` key as its unique `fieldTypeIdentifier` e.g. `ezstring`. +Each service tagged as `ibexa.field_type` is added to a [registry](https://martinfowler.com/eaaCatalog/registry.html) using the `alias` key as its unique `fieldTypeIdentifier`, for example, `ezstring`. Each field type must also inherit from the abstract `ibexa.field_type` service. This ensures that the initialization steps shared by all field types are executed. @@ -143,9 +143,9 @@ To make the search engine aware of the data stored in a field type, register it It's recommended to use a simple associative array format for the settings schema returned by `Ibexa\Contracts\Core\FieldType\FieldType::getSettingsSchema()`, which follows these rules: -- The key of the associative array identifies a setting (e.g. `default`) +- The key of the associative array identifies a setting (for example, `default`) - Its value is an associative array describing the setting using: - - `type` to identify the setting type (e.g. `int` or `string`) + - `type` to identify the setting type (for example, `int` or `string`) - `default` containing the default setting value An example schema could look like this: diff --git a/docs/content_management/url_management/url_api.md b/docs/content_management/url_management/url_api.md index e12facc24c..e956740e91 100644 --- a/docs/content_management/url_management/url_api.md +++ b/docs/content_management/url_management/url_api.md @@ -12,7 +12,7 @@ To view a list of all URLs, use [`URLService::findUrls`](../../api/php_api/php_a `URLService::findUrls` takes as argument a [`URLQuery`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-URL-URLQuery.html), in which you need to specify: -- query filter e.g. Section +- query filter, for example, Section - Sort Clauses for URL queries - offset for search hits, used for paging the results - query limit. If value is `0`, search query doesn't return any search hits diff --git a/docs/content_management/url_management/url_management.md b/docs/content_management/url_management/url_management.md index 3f19b13aba..fdff33342a 100644 --- a/docs/content_management/url_management/url_management.md +++ b/docs/content_management/url_management/url_management.md @@ -212,7 +212,7 @@ bin/console ibexa:urls:regenerate-aliases You can also extend the command with the following parameters: - `--iteration-count` — Defines how many Locations are processed at once to reduce memory usage -- `--location-id` — Regenerates URL addresses for specific Locations only, e.g. `ibexa:urls:regenerate-aliases --location-id=1 --location-id=2` +- `--location-id` — Regenerates URL addresses for specific Locations only, for example, `ibexa:urls:regenerate-aliases --location-id=1 --location-id=2` ## URL wildcards diff --git a/docs/customer_management/create_user_registration_form.md b/docs/customer_management/create_user_registration_form.md index 8d997cbe53..c8d3685123 100644 --- a/docs/customer_management/create_user_registration_form.md +++ b/docs/customer_management/create_user_registration_form.md @@ -13,8 +13,8 @@ First, make sure you [enabled user registration](permission_use_cases.md#registe In your configuration, under `allowed_field_definitions_identifiers` [configuration key](configuration.md#configuration-files), specify the fields that should be part of your registration form. -You can also define what kind of user you want to create under `user_type_identifier` e.g. frontend user. -To learn more about available users, see [user types documentation](user_registration.md#user-types). +You can also define what kind of user you want to create under `user_type_identifier`, for example, frontend user. +To learn more about available users, see [user types documentation](user_registration.md#user-types). ``` yaml ibexa: diff --git a/docs/getting_started/troubleshooting.md b/docs/getting_started/troubleshooting.md index 6e5f4b5277..baf4d54405 100644 --- a/docs/getting_started/troubleshooting.md +++ b/docs/getting_started/troubleshooting.md @@ -24,7 +24,7 @@ That means changing `%env(resolve:DATABASE_URL)%` to `%env(DATABASE_URL)%`. If your password only contains letters a-z, A-Z, and numbers 0-9, you don't need to do any encoding. You can either create your password that way, in which case it's a good idea to make it longer to maintain entropy, keeping the password hard to guess for an attacker. -Or, you can for instance convert your password with `bin2hex()`, so that e.g. `(/!=#Ƥ*;%?[` becomes `282f213d23c386c2a42a3b253f5b`. +Or, you can for instance convert your password with `bin2hex()`, so that, for example, `(/!=#Ƥ*;%?[` becomes `282f213d23c386c2a42a3b253f5b`. The output from `bin2hex` is limited to 0-9 and a-f. This more than doubles the length of the password, keeping entropy similar. ## Enabling swap with limited RAM @@ -34,7 +34,7 @@ It allows your operating system to use the hard disk to supplement RAM when it r With swap enables you're able to successfully run `php -d memory_limit=-1 bin/console ibexa:install --env prod ezplatform-clean`. -When a system runs out of RAM, you may see `Killed` when trying to clear the cache (e.g. `php bin/console --env=prod cache:clear` from your project's root directory). +When a system runs out of RAM, you may see `Killed` when trying to clear the cache (for example, `php bin/console --env=prod cache:clear` from your project's root directory). ## Upload size limit diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index 35b50adfd5..28813143ec 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -199,7 +199,7 @@ See [Tagging from code](https://foshttpcachebundle.readthedocs.io/en/latest/feat 4\. Use deprecated `X-Location-Id` header. -For custom or built-in controllers (e.g. REST) still using `X-Location-Id`, `XLocationIdResponseSubscriber` handles translating +For custom or built-in controllers (for example, REST) still using `X-Location-Id`, `XLocationIdResponseSubscriber` handles translating this header to tags. It supports singular and comma-separated Location ID value(s): ```php diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 30cbe58757..cc47ce2d0b 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -90,7 +90,7 @@ ibexa: ### In-Memory cache configuration Persistence cache layer caches selected objects in-memory for a short time. -It avoids loading repeatedly the same data from e.g. a remote Redis instance, which can take up to 4-5ms per call due to the network latency and Redis instance load. +It avoids loading repeatedly the same data from, for example, a remote Redis instance, which can take up to 4-5ms per call due to the network latency and Redis instance load. The cache is organized in 2 pools, one for metadata which isn't updated frequently, and one for content related objects that is only meant as a short-lived burst cache. Limit is organized using a [least frequently used (LFU)](https://en.wikipedia.org/wiki/Least_frequently_used) approach. It makes sure repeatedly used objects stay in-memory until expired, and those seldom used are bulk evicted from cache every time the maximum number of cache items is reached. @@ -120,7 +120,7 @@ parameters: !!! caution "In-Memory cache is per-process" **TTL and Limit need to have a low value.** Setting limit high increases memory use. - High TTL value also increases exponentially risk for system acting on stale metadata (e.g. content type definitions). + High TTL value also increases exponentially risk for system acting on stale metadata (for example, content type definitions). The only case where it's safe to increase these values is for dev environment with single concurrency on writes. In prod environment you should only consider reducing them if you have heavy concurrency writes. @@ -196,10 +196,10 @@ With that in mind, the following configurations of Redis are possible: - Shard slaves can improve availability, however [they use asynchronous replication](https://redis.io/docs/management/scaling/#redis-cluster-consistency-guarantees) so they can't be used for reads - Unsupported Redis features that can affect performance: [pipelining](https://github.com/phpredis/phpredis/blob/develop/cluster.md#pipelining) and [most multiple key commands](https://github.com/phpredis/phpredis/blob/develop/cluster.md#multiple-key-commands) - [Redis Sentinel](https://redis.io/docs/management/sentinel/) - - Provides high availability by providing one or several slaves (ideally 2 slaves or more, e.g. minimum 3 servers), and handle failover + - Provides high availability by providing one or several slaves (ideally 2 slaves or more, for example, minimum 3 servers), and handle failover - [Slaves are asynchronously replicated](https://redis.io/docs/management/sentinel/#fundamental-things-to-know-about-sentinel-before-deploying), so they can't be used for reads - - Typically used with a load balancer (e.g. HAproxy with occasional calls to Redis Sentinel API) in the front to only speak to elected master - - As of v3 you can also configure this [directly on the connection string]([[= symfony_doc =]]/components/cache/adapters/redis_adapter.html#configure-the-connection), **if** you use `Predis` instead of `php-redis` + - Typically used with a load balancer (for example, HAproxy with occasional calls to Redis Sentinel API) in the front to only speak to elected master + - As of v3 you can also configure this [directly on the connection string]([[= symfony_doc =]]/components/cache/adapters/redis_adapter.html#configure-the-connection), **if** you use `Predis` instead of `php-redis` Several cloud providers have managed services that are easier to set up, handle replication and scalability for you, and might perform better. Notable services include: diff --git a/docs/infrastructure_and_maintenance/clustering/clustering.md b/docs/infrastructure_and_maintenance/clustering/clustering.md index d8c3f5ab6a..3760d7fb36 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering.md @@ -258,7 +258,7 @@ Place this before the include of `ez_params.d`/`ez_rewrite_params` in your vhost If you're migrating an existing single-server site to a cluster setup, and not setting up clustering from scratch, you need to migrate your files. Once you have configured your binarydata and metadata handlers, you can run the `ibexa:io:migrate-files` command. -You can also use it when you're migrating from one data handler to another, e.g. from NFS to Amazon S3. +You can also use it when you're migrating from one data handler to another, for example, from NFS to Amazon S3. This command shows which handlers are configured: diff --git a/docs/infrastructure_and_maintenance/performance.md b/docs/infrastructure_and_maintenance/performance.md index 2a15e4feff..0300ce4909 100644 --- a/docs/infrastructure_and_maintenance/performance.md +++ b/docs/infrastructure_and_maintenance/performance.md @@ -40,7 +40,7 @@ In production setups: ### VM - Avoid shared filesystems for code (Docker for Mac/Win, VirtualBox/*, Vagrant, etc.), because they typically slow down the application 10x or more, compared to native Linux filesystem. -- VM in itself also adds 10-30% of overhead. However when it comes to production, e.g. AWS vs barebones, it also comes down to cost and convenience factors. +- VM in itself also adds 10-30% of overhead. However when it comes to production, for example, AWS vs barebones, it also comes down to cost and convenience factors. ### Web server diff --git a/docs/infrastructure_and_maintenance/security/development_security.md b/docs/infrastructure_and_maintenance/security/development_security.md index 1a85936b4f..92969ba847 100644 --- a/docs/infrastructure_and_maintenance/security/development_security.md +++ b/docs/infrastructure_and_maintenance/security/development_security.md @@ -94,7 +94,7 @@ If you want to use this feature, you must at least extend the login template to #### Login handlers / SSO -Symfony provides native support for [multiple user providers]([[= symfony_doc =]]/security/multiple_user_providers.html). This makes it easy to integrate any kind of login handlers, including SSO and existing third-party bundles (e.g. [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), etc.). +Symfony provides native support for [multiple user providers]([[= symfony_doc =]]/security/multiple_user_providers.html). This makes it easy to integrate any kind of login handlers, including SSO and existing third-party bundles (for example, [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), etc.). See [Authenticating a user with multiple user provider](user_authentication.md#authenticate-user-with-multiple-user-providers) for more information. diff --git a/docs/multisite/languages/back_office_translations.md b/docs/multisite/languages/back_office_translations.md index 438988bed3..4f6072d1a9 100644 --- a/docs/multisite/languages/back_office_translations.md +++ b/docs/multisite/languages/back_office_translations.md @@ -84,7 +84,7 @@ private function getTranslatedDescription(): string The strings are provided in .xliff files. The file should be stored in your project's or your bundle's `Resources/translations` folder. -File name corresponds to the selected domain and the language, e.g. `custom_extension.en.xliff`. +File name corresponds to the selected domain and the language, for example, `custom_extension.en.xliff`. ``` xml diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index cb89b0d261..d97340a193 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -91,7 +91,7 @@ ibexa: !!! note - The top prioritized language is always used the SiteAccess language reference (e.g. `fre-FR` for `fre` SiteAccess in the example above). + The top prioritized language is always used the SiteAccess language reference (for example, `fre-FR` for `fre` SiteAccess in the example above). If several translation SiteAccesses share the same language reference, **the first declared SiteAccess always applies**. diff --git a/docs/multisite/site_factory/site_factory_configuration.md b/docs/multisite/site_factory/site_factory_configuration.md index f87834c227..1784fbabf6 100644 --- a/docs/multisite/site_factory/site_factory_configuration.md +++ b/docs/multisite/site_factory/site_factory_configuration.md @@ -49,7 +49,7 @@ Remember that one template can only have one Site skeleton. If the design doesn't have a defined Site skeleton, a directory of the new site is created in a standard Site Factory process. To define a Site skeleton, add the `site_skeleton_id` or `site_skeleton_remote_id` key to the site template definition. -This can be either a Location ID (e.g. `5966`), or a remote Location ID (e.g. `3bed95afb1f8126f06a3c464e461e1ae66`). +This can be either a Location ID (for example, `5966`), or a remote Location ID (for example, `3bed95afb1f8126f06a3c464e461e1ae66`). ``` yaml hl_lines="7 12" ibexa_site_factory: diff --git a/docs/multisite/siteaccess/siteaccess_aware_configuration.md b/docs/multisite/siteaccess/siteaccess_aware_configuration.md index 533dd875fb..bedf93ff5a 100644 --- a/docs/multisite/siteaccess/siteaccess_aware_configuration.md +++ b/docs/multisite/siteaccess/siteaccess_aware_configuration.md @@ -5,7 +5,7 @@ description: Make sure your custom development's configuration can be used with # SiteAccess-aware configuration The [Symfony Config component]([[= symfony_doc =]]/components/config.html) makes it possible to define semantic configuration, exposed to the end developer. -This configuration is validated by rules you define, e.g. validating type (string, array, integer, boolean and so on). +This configuration is validated by rules you define, for example, validating type (string, array, integer, boolean and so on). Usually, after it's validated and processed, this semantic configuration is then mapped to internal *key/value* parameters stored in the service container. [[= product_name =]] uses this for its core configuration, but adds another configuration level, the SiteAccess. diff --git a/docs/multisite/siteaccess/siteaccess_matching.md b/docs/multisite/siteaccess/siteaccess_matching.md index 9233ba2f9f..42d1019ae0 100644 --- a/docs/multisite/siteaccess/siteaccess_matching.md +++ b/docs/multisite/siteaccess/siteaccess_matching.md @@ -46,8 +46,8 @@ ibexa: If the matcher class doesn't start with a backslash (`\`), it's relative to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher` (for example, `Map\URI` refers to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI`) -You can specify [custom matchers](#custom-matchers) by using a fully qualified class name (e.g. `\My\SiteAccess\Matcher`) -or a service identifier (e.g. `@my_matcher_service`). +You can specify [custom matchers](#custom-matchers) by using a fully qualified class name (for example, `\My\SiteAccess\Matcher`) +or a service identifier (for example, `@my_matcher_service`). In the case of a fully qualified class name, the matching configuration is passed in the constructor. In the case of a service, it must implement `Ibexa\Bundle\Core\SiteAccess\Matcher`. The matching configuration is passed to `setMatchingConfiguration()`. diff --git a/docs/permissions/permission_overview.md b/docs/permissions/permission_overview.md index 3390f3c788..86ea5e003f 100644 --- a/docs/permissions/permission_overview.md +++ b/docs/permissions/permission_overview.md @@ -47,8 +47,8 @@ public function performAccessCheck(): void `Attribute` accepts three arguments: -- `module` is the policy module (e.g. `content`) -- `function` is the function inside the module (e.g. `read`) +- `module` is the policy module (for example,`content`) +- `function` is the function inside the module (for example, `read`) - `limitations` are optional limitations to check against. Here you can provide two keys: - `valueObject` is the object you want to check for, for example `ContentInfo`. - `targets` are a table of value objects that are the target of the operation. diff --git a/docs/release_notes/ez_platform_v2.5.md b/docs/release_notes/ez_platform_v2.5.md index e7b29f81c3..361093094f 100644 --- a/docs/release_notes/ez_platform_v2.5.md +++ b/docs/release_notes/ez_platform_v2.5.md @@ -149,7 +149,7 @@ New API improvements include: - new `loadLanguageListByCode()` and `loadLanguageListById()` endpoints for bulk loading of languages - new method `ContentService->loadContentInfoList()` for bulk loading Content information - it can be used with `ContentService->loadContentListByContentInfo()` to bulk load Content - - v2.5 also takes advantage of it in e.g. `RelationList` and `ParameterProvider` + - v2.5 also takes advantage of it in, for example, `RelationList` and `ParameterProvider` - now Persistence cache layer also caches selected metadata objects in-memory - indexation of related objects in the full text search diff --git a/docs/search/search_engines/solr_search_engine/configure_solr.md b/docs/search/search_engines/solr_search_engine/configure_solr.md index e3a00e663a..97d145e901 100644 --- a/docs/search/search_engines/solr_search_engine/configure_solr.md +++ b/docs/search/search_engines/solr_search_engine/configure_solr.md @@ -52,7 +52,7 @@ The configuration above results in the following boosting (content type / Field) !!! tip "How to configure boosting on specific fields" Currently, boosting on particular fields is missing. - However, it could be configured using 3rd party [Novactive/NovaeZSolrSearchExtraBundle](https://github.com/Novactive/NovaeZSolrSearchExtraBundle) in case of custom search implementation, e.g. to handle your front-end search form. + However, it could be configured using 3rd party [Novactive/NovaeZSolrSearchExtraBundle](https://github.com/Novactive/NovaeZSolrSearchExtraBundle) in case of custom search implementation, for example, to handle your front-end search form. Unfortunately, this doesn't affect search performed in the administration interface. The following example presents boosting configuration for Folder's `name` and `description` fields. diff --git a/docs/search/sort_clause_reference/ismainlocation_sort_clause.md b/docs/search/sort_clause_reference/ismainlocation_sort_clause.md index a3867e7ad1..5ead5b6df8 100644 --- a/docs/search/sort_clause_reference/ismainlocation_sort_clause.md +++ b/docs/search/sort_clause_reference/ismainlocation_sort_clause.md @@ -3,7 +3,7 @@ The [`Location\IsMainLocation` Sort Clause](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-SortClause-Location-IsMainLocation.html) sorts search results by whether their Location is the main Location of the content item. -Locations that aren't main Locations are ranked as lower values (e.g. with ascending order they are returned first). +Locations that aren't main Locations are ranked as lower values (for example, with ascending order they are returned first). ## Arguments diff --git a/docs/search/sort_clause_reference/visibility_sort_clause.md b/docs/search/sort_clause_reference/visibility_sort_clause.md index 3f06734da3..18f6971e8c 100644 --- a/docs/search/sort_clause_reference/visibility_sort_clause.md +++ b/docs/search/sort_clause_reference/visibility_sort_clause.md @@ -3,7 +3,7 @@ The [`Location\Visibility` Sort Clause](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-SortClause-Location-Visibility.html) sorts search results by whether the Location is visible or not. -Locations that aren't visible are ranked as higher values (e.g. with ascending order they're returned last). +Locations that aren't visible are ranked as higher values (for example, with ascending order they're returned last). ## Arguments diff --git a/docs/tutorials/generic_field_type/5_add_a_field.md b/docs/tutorials/generic_field_type/5_add_a_field.md index 2d2ba60d2e..ab78608c3e 100644 --- a/docs/tutorials/generic_field_type/5_add_a_field.md +++ b/docs/tutorials/generic_field_type/5_add_a_field.md @@ -39,7 +39,7 @@ Click it to create new content. ![Selecting Point 2D from sidebar](menu_point2d.png) -Here, you can fill in coordinates of your point, e.g. 3, 5. +Here, you can fill in coordinates of your point, for example, 3, 5. Provided coordinates are used as a title for a new point. ![Creating Point 2D](creating_new_point2d.png) diff --git a/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md b/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md index 1c7eb3b12d..c667c5aa1c 100644 --- a/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md +++ b/docs/tutorials/page_and_form_tutorial/5_create_newsletter_form.md @@ -52,7 +52,7 @@ Create a `newsletter.html.twig` file in `templates/blocks/form/`: This template extends the default block layout by adding an additional class (line 1) that shares CSS styling with the Random block. Append the new template to the block by adding it to `config/packages/ibexa_fieldtype_page.yaml`. -Add the following configuration under the `blocks` key at the same level as other block names, e.g. `random`: +Add the following configuration under the `blocks` key at the same level as other block names, for example, `random`: ``` yaml hl_lines="1" [[= include_file('code_samples/tutorials/page_tutorial/config/packages/ibexa_fieldtype_page.yaml', 42, 47) =]] diff --git a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md index 42eba7d3e4..4f1ad360a1 100644 --- a/docs/update_and_migration/from_2.5/adapt_code_to_v3.md +++ b/docs/update_and_migration/from_2.5/adapt_code_to_v3.md @@ -23,7 +23,7 @@ When updating to eZ Platform v3 you need to move your files and modify file path #### Configuration Configuration files have been moved from `app/Resources/config` to `config`. -Package-specific configuration is placed in `config/packages` (e.g. `config/packages/ezplatform_admin_ui.yaml`). +Package-specific configuration is placed in `config/packages` (for example, `config/packages/ezplatform_admin_ui.yaml`). This folder also contains `config/packages/ezplatform.yaml`, which contains all settings coming in from Kernel. #### PHP code and bundle organization diff --git a/docs/update_and_migration/from_2.5/update_code/7_update_extensions.md b/docs/update_and_migration/from_2.5/update_code/7_update_extensions.md index 8095c9282e..3aff7545eb 100644 --- a/docs/update_and_migration/from_2.5/update_code/7_update_extensions.md +++ b/docs/update_and_migration/from_2.5/update_code/7_update_extensions.md @@ -3,7 +3,7 @@ ## Universal Discovery Widget If you extended the Universal Discovery Widget -(e.g. added your own tabs or triggered opening the UDW for your own customizations), +(for example, added your own tabs or triggered opening the UDW for your own customizations), you need to rewrite this extension using the [new YAML configuration](https://doc.ibexa.co/en/3.3/extending/extending_udw/). ## Back office extensibility From b598eacd0b102c6d4c6f34b12ee98b73d088249e Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 10:08:41 +0200 Subject: [PATCH 25/77] Fixes in 'back office' section --- docs/administration/back_office/add_user_setting.md | 9 +++------ .../back_office/back_office_configuration.md | 3 +-- .../back_office_elements/custom_components.md | 2 +- .../back_office_elements/extending_thumbnails.md | 13 +++++++------ .../formatting_date_and_time.md | 4 ++-- .../importing_assets_from_bundle.md | 10 ++++------ .../back_office_menus/back_office_menus.md | 6 +++--- .../back_office_tabs/back_office_tabs.md | 3 ++- .../back_office/browser/add_browser_tab.md | 8 +++++--- docs/administration/back_office/browser/browser.md | 8 +++++--- .../back_office/content_tab_switcher.md | 1 + .../back_office/customize_calendar.md | 2 +- .../back_office/customize_search_suggestion.md | 3 ++- docs/administration/back_office/multifile_upload.md | 3 +-- docs/administration/back_office/notifications.md | 6 +++--- 15 files changed, 41 insertions(+), 40 deletions(-) diff --git a/docs/administration/back_office/add_user_setting.md b/docs/administration/back_office/add_user_setting.md index 6f72b0040f..c994960139 100644 --- a/docs/administration/back_office/add_user_setting.md +++ b/docs/administration/back_office/add_user_setting.md @@ -8,11 +8,9 @@ description: Add the option to select a custom preference in user menu. You can add new preferences to the **User Settings** menu in the back office. -To do so, create a setting class implementing two interfaces: -`ValueDefinitionInterface` and `FormMapperInterface`. +To do so, create a setting class implementing two interfaces: `ValueDefinitionInterface` and `FormMapperInterface`. -In this example the class is located in `src/Setting/Unit.php` -and enables the user to select their preference for metric or imperial unit systems. +In this example the class is located in `src/Setting/Unit.php` and enables the user to select their preference for metric or imperial unit systems. ``` php [[= include_file('code_samples/back_office/settings/src/Setting/Unit.php') =]] @@ -45,8 +43,7 @@ The value of the setting is accessible with `ez_user_settings['unit']`. ## Create template for editing settings -You can override a template used when editing the new setting -under the `ibexa.system..user_settings_update_view` [configuration key](configuration.md#configuration-files): +You can override a template used when editing the new setting under the `ibexa.system..user_settings_update_view` [configuration key](configuration.md#configuration-files): ``` yaml [[= include_file('code_samples/back_office/settings/config/packages/user_settings.yaml') =]] diff --git a/docs/administration/back_office/back_office_configuration.md b/docs/administration/back_office/back_office_configuration.md index 2426d99e49..68d58c32f4 100644 --- a/docs/administration/back_office/back_office_configuration.md +++ b/docs/administration/back_office/back_office_configuration.md @@ -49,8 +49,7 @@ You can copy subtree from CLI using the command: `bin/console ibexa:copy-subtree ## Default Locations -Default Location IDs for [Content structure, Media and Users](locations.md#top-level-locations) in the menu are configured -using the `ibexa.system..location_ids` [configuration key](configuration.md#configuration-files): +Default Location IDs for [Content structure, Media and Users](locations.md#top-level-locations) in the menu are configured using the `ibexa.system..location_ids` [configuration key](configuration.md#configuration-files): ``` yaml ibexa: diff --git a/docs/administration/back_office/back_office_elements/custom_components.md b/docs/administration/back_office/back_office_elements/custom_components.md index 5f490bc4fc..f191f0a6a9 100644 --- a/docs/administration/back_office/back_office_elements/custom_components.md +++ b/docs/administration/back_office/back_office_elements/custom_components.md @@ -61,7 +61,7 @@ appbundle.components.my_twig_component: This renders the `path/to/file.html.twig` template with `first_param` and `second_param` as parameters. -With `LinkComponent` and `ScriptComponent` you provide `$href` and `$src` as arguments, respectively: +With `LinkComponent` and `ScriptComponent` you provide `$href` and `$src` as arguments: ``` yaml app.components.my_link_component: diff --git a/docs/administration/back_office/back_office_elements/extending_thumbnails.md b/docs/administration/back_office/back_office_elements/extending_thumbnails.md index 7984e1ea43..9155ac153a 100644 --- a/docs/administration/back_office/back_office_elements/extending_thumbnails.md +++ b/docs/administration/back_office/back_office_elements/extending_thumbnails.md @@ -4,10 +4,10 @@ description: Customize thumbnails use for content items in the back office. # Extending thumbnails -The thumbnails API enable you to easily choose an image for a specific content. +The thumbnails API enable you to choose an image for a specific content. If you don't want to use custom thumbnails, `ContentType` is used instead. -## Thumbnail mechanism +## Thumbnail mechanism The thumbnail mechanism has two layers, and each layer can have many implementations. The mechanism checks if any of the implementations returns a field, for example, `ezimage`, that has function "Can be a thumbnail" turned on. @@ -29,14 +29,14 @@ For this layer there are following default implementations: ### Second layer -Second layer of mechanism enables selection of thumbnail from a field that the first layer has found. +Second layer of mechanism enables selection of thumbnail from a field that the first layer has found. It searches the content type for all the fields, for example, images, with function "Can be a thumbnail" turned on. If there is more than one field in the content type that can be used as a thumbnail, this layer returns the first nonempty field as a thumbnail. This mechanism can be modified to fit your site needs, so you can decide from where and how the thumbnails is downloaded. -### Create a thumbnail mechanism +### Create a thumbnail mechanism First, create base strategy for returning custom thumbnails from a static file. Create `StaticStrategy.php` in `src/Strategy`. @@ -46,7 +46,7 @@ Create `StaticStrategy.php` in `src/Strategy`. ``` Next, add the strategy with the `ibexa.repository.thumbnail.strategy.content` tag and `priority: 100` to `config/services.yaml`: - + ```yaml [[= include_file('code_samples/back_office/thumbnails/config/custom_services.yaml') =]] ``` @@ -57,7 +57,8 @@ At this point you can go to the back office and check the results. !!! note "Thumbnail mechanism " - This strategy overrides all generated thumbnails. You can specify a specific content type. See the example [here](https://github.com/ibexa/user/blob/main/src/lib/Strategy/DefaultThumbnailStrategy.php) + This strategy overrides all generated thumbnails. You can specify a specific content type. + See the example [here](https://github.com/ibexa/user/blob/main/src/lib/Strategy/DefaultThumbnailStrategy.php) ## Other fields as thumbnails diff --git a/docs/administration/back_office/back_office_elements/formatting_date_and_time.md b/docs/administration/back_office/back_office_elements/formatting_date_and_time.md index ba1992338f..499d3216d8 100644 --- a/docs/administration/back_office/back_office_elements/formatting_date_and_time.md +++ b/docs/administration/back_office/back_office_elements/formatting_date_and_time.md @@ -54,7 +54,7 @@ class MyService Then, add the following to `config/services.yaml`: ``` yaml -services: +services: App\Service\MyService: arguments: $shortDateTimeFormatter: '@ibexa.user.settings.short_datetime_format.formatter' @@ -62,7 +62,7 @@ services: ## Using User settings menu -Users can set their preferred date and time formats in the User settings menu. +Users can set their preferred date and time formats in the user settings menu. This format is used throughout the back office. You can set the list of available formats under the `ibexa.system..user_preferences` [configuration key](configuration.md#configuration-files): diff --git a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md index 833bff03ef..1b4287e39a 100644 --- a/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md +++ b/docs/administration/back_office/back_office_elements/importing_assets_from_bundle.md @@ -12,7 +12,7 @@ To import assets from a bundle, configure them in an `ibexa.config.js` file that ``` js const path = require('path'); - + module.exports = (Encore) => { Encore.addEntry('', [ path.resolve(__dirname, ''), @@ -32,8 +32,7 @@ To import CSS files only, use: After you add new files, run `php bin/console cache:clear`. - For a full example of importing asset configuration, - see [`ibexa.config.js`](https://github.com/ibexa/admin-ui/blob/main/src/bundle/Resources/encore/ibexa.config.js) + For a full example of importing asset configuration, see [`ibexa.config.js`](https://github.com/ibexa/admin-ui/blob/main/src/bundle/Resources/encore/ibexa.config.js) To edit existing configuration entries, either in the bundle's `Resources/encore/` folder, or in the `encore` folder in the root folder of your project, create an `ibexa.config.manager.js` file: @@ -75,8 +74,7 @@ module.exports = (ibexaConfig, ibexaConfigManager) => { After you add new files, run `php bin/console cache:clear`. - For a full example of overriding configuration, - see [`ibexa.config.manager.js`](https://github.com/ibexa/fieldtype-matrix/blob/main/src/bundle/Resources/encore/ibexa.config.manager.js). + For a full example of overriding configuration, see [`ibexa.config.manager.js`](https://github.com/ibexa/fieldtype-matrix/blob/main/src/bundle/Resources/encore/ibexa.config.manager.js). To add a new configuration under your own namespace and with its own dependencies, create an `ibexa.webpack.custom.config.js` file that you create either in the bundle's `Resources/encore/` folder, or in the `encore` folder in the root directory of your project, for example: @@ -107,7 +105,7 @@ To add a new configuration under your own namespace and with its own dependencie If you prefer to include the asset configuration in the main project files, add it in [`webpack.config.js`](https://github.com/ibexa/recipes/blob/master/ibexa/oss/4.0/encore/webpack.config.js#L31). -To overwrite the built-in assets, use the following configuration to replace, remove or add asset files in `webpack.config.js`: +To overwrite the built-in assets, use the following configuration to replace, remove, or add asset files in `webpack.config.js`: ``` js ibexaConfigManager.replace({ diff --git a/docs/administration/back_office/back_office_menus/back_office_menus.md b/docs/administration/back_office/back_office_menus/back_office_menus.md index a3c1f4fc5d..b034ae674f 100644 --- a/docs/administration/back_office/back_office_menus/back_office_menus.md +++ b/docs/administration/back_office/back_office_menus/back_office_menus.md @@ -35,7 +35,7 @@ You can listen to the following events: || `ConfigureMenuEvent::CONTENT_CREATE_SIDEBAR_RIGHT` | || `ConfigureMenuEvent::CONTENT_SIDEBAR_LEFT` | | Trash | `ConfigureMenuEvent::TRASH_SIDEBAR_RIGHT` | -| Section | `ConfigureMenuEvent::SECTION_EDIT_SIDEBAR_RIGHT` +| Section | `ConfigureMenuEvent::SECTION_EDIT_SIDEBAR_RIGHT` || `ConfigureMenuEvent::SECTION_CREATE_SIDEBAR_RIGHT` | | Policies and permissions | `ConfigureMenuEvent::POLICY_EDIT_SIDEBAR_RIGHT` | || `ConfigureMenuEvent::POLICY_CREATE_SIDEBAR_RIGHT` | @@ -63,7 +63,8 @@ You can listen to the following events: ## Adding menu items -To add a menu item, use the `addChild()` method. Provide the method with the new menu item's identifier and, optionally, with parameters. +To add a menu item, use the `addChild()` method. +Provide the method with the new menu item's identifier and, optionally, with parameters. To add an inactive menu section, don't add a route to its parameters. @@ -135,4 +136,3 @@ To remove a menu item, for example, to remove the **Copy subtree** item from the ``` php [[= include_file('code_samples/back_office/menu/menu_item/src/EventSubscriber/MyMenuSubscriber.php', 44, 45) =]] ``` - diff --git a/docs/administration/back_office/back_office_tabs/back_office_tabs.md b/docs/administration/back_office/back_office_tabs/back_office_tabs.md index ddd1857a67..05f3a89f46 100644 --- a/docs/administration/back_office/back_office_tabs/back_office_tabs.md +++ b/docs/administration/back_office/back_office_tabs/back_office_tabs.md @@ -53,7 +53,7 @@ Tabs are displayed according to this value in ascending order. !!! tip - It is good practice to reserve some distance between these values, for example to stagger them by step of 10. + It's a good practice to reserve some distance between these values, for example to stagger them by step of 10. It may come useful if you later need to place something between the existing tabs. You can also influence tab display (for example, order tabs, remove, or modify them) by using the following event listeners: @@ -73,4 +73,5 @@ To create a tab group, register it as a service: Tag the group with `ibexa.admin_ui.component`. `group` indicates where the group is rendered. + For a list of possible rendering places, see [Injecting custom components](custom_components.md). diff --git a/docs/administration/back_office/browser/add_browser_tab.md b/docs/administration/back_office/browser/add_browser_tab.md index 79585a81b5..a2225e28ae 100644 --- a/docs/administration/back_office/browser/add_browser_tab.md +++ b/docs/administration/back_office/browser/add_browser_tab.md @@ -4,7 +4,8 @@ description: Add a custom tab displaying selected data to the content browser. # Add browser tab -The Universal Discovery Widget (UDW) is a separate React module. By default, it contains two tabs: Browse and Bookmarks. +The Universal Discovery Widget (UDW) is a separate React module. +By default, it contains two tabs: Browse and Bookmarks. ![UDW default tabs](udw_tabs.png) @@ -120,8 +121,9 @@ ibexaConfigManager.add({ ## Check results -In the back office go to **Content** -> **Dashboard**. On the top right, click the **Create content** button. -In the UDW a new **Images** tab appears, listing all images from the Repository. +In the back office go to **Content** -> **Dashboard**. +On the top right, click the **Create content** button. +In the UDW a new **Images** tab appears, listing all images from the repository. ![Image tab in UDW](udw_image_tab.png) diff --git a/docs/administration/back_office/browser/browser.md b/docs/administration/back_office/browser/browser.md index 318123c085..a0da7896d4 100644 --- a/docs/administration/back_office/browser/browser.md +++ b/docs/administration/back_office/browser/browser.md @@ -4,12 +4,13 @@ description: Customize the configuration of the content browser. # Browser -Browsing the content structure and selecting content from the Repository uses the module Universal Discovery Widget (UDW). +Browsing the content structure and selecting content from the repository uses the module Universal Discovery Widget (UDW). UDW has an interactive interface which allows you to create, move or copy content items. ## Using UDW -UDW requires that you provide configuration by using the `ibexa_udw_config` Twig helper. This configuration must be spread to the props of the component itself. +UDW requires that you provide configuration by using the `ibexa_udw_config` Twig helper. +This configuration must be spread to the props of the component itself. ```html+twig ``` -`single` configuration is one of the default configuration provided. You can also do your [own configuration](#add-new-configuration). +`single` configuration is one of the default configuration provided. +You can also do your [own configuration](#add-new-configuration). With plain JS: diff --git a/docs/administration/back_office/content_tab_switcher.md b/docs/administration/back_office/content_tab_switcher.md index a7c9af48a0..f163d245e1 100644 --- a/docs/administration/back_office/content_tab_switcher.md +++ b/docs/administration/back_office/content_tab_switcher.md @@ -39,6 +39,7 @@ ibexa: The default configuration makes the `ibexa_taxonomy_entry_assignment` field always visible in the Meta tab in the content form. With this new feature, you can indicate what field types, previously set in the back office content type, are shown in the Meta tab section in the content form. You can automatically move all field types from Metadata group to the Meta tab in the content form. + To do it, use the following configuration: ```yaml diff --git a/docs/administration/back_office/customize_calendar.md b/docs/administration/back_office/customize_calendar.md index b3def31e15..d8b1680842 100644 --- a/docs/administration/back_office/customize_calendar.md +++ b/docs/administration/back_office/customize_calendar.md @@ -83,7 +83,7 @@ To add an in-memory collection as an event source, create `src/Calendar/Holidays $this->createEvent("Event 1", new DateTime("2024-01-01")), $this->createEvent("Event 2", new DateTime("2024-01-02")), // ... - ``` + ``` Next, register the event source as a service: diff --git a/docs/administration/back_office/customize_search_suggestion.md b/docs/administration/back_office/customize_search_suggestion.md index 3c6e66f1dd..426353baa5 100644 --- a/docs/administration/back_office/customize_search_suggestion.md +++ b/docs/administration/back_office/customize_search_suggestion.md @@ -30,6 +30,7 @@ After this event, the suggestion collection is sorted by score and truncated to !!! tip You can list listeners and subscribers with the following command: + ``` shell php bin/console debug:event BuildSuggestionCollectionEvent ``` @@ -113,7 +114,7 @@ Here is a complete `assets/js/admin.search.autocomplete.product.js` from the pro [[= include_file('code_samples/back_office/search/assets/js/admin.search.autocomplete.product.js') =]] ``` -To be loaded in the back office layout, this file must be added to Webpack entry `ibexa-admin-ui-layout-js`. +To be loaded in the back office layout, this file must be added to Webpack entry `ibexa-admin-ui-layout-js`. At the end of `webpack.config.js`, add it by using `ibexaConfigManager`: ``` javascript diff --git a/docs/administration/back_office/multifile_upload.md b/docs/administration/back_office/multifile_upload.md index 9e6e4ac3ba..29fe248a7b 100644 --- a/docs/administration/back_office/multifile_upload.md +++ b/docs/administration/back_office/multifile_upload.md @@ -9,8 +9,7 @@ It provides an interface to publish content based on dropped files while uploadi !!! caution - If you want to load the multi-file upload module, you need to load the JS code for it in your view, - as it's not available by default. + If you want to load the multi-file upload module, you need to load the JS code for it in your view, as it's not available by default. ## Use multi-file upload diff --git a/docs/administration/back_office/notifications.md b/docs/administration/back_office/notifications.md index 73e9c7fb11..0a360391de 100644 --- a/docs/administration/back_office/notifications.md +++ b/docs/administration/back_office/notifications.md @@ -85,8 +85,7 @@ Finally, you need to add an entry to `config/services.yaml`: ## Notification timeout -To define the timeout for hiding Back-Office notification bars, per notification type, -use the `ibexa.system..notifications..timeout` [configuration key](configuration.md#configuration-files): +To define the timeout for hiding Back-Office notification bars, per notification type, use the `ibexa.system..notifications..timeout` [configuration key](configuration.md#configuration-files): ``` yaml ibexa: @@ -103,4 +102,5 @@ ibexa: timeout: 0 ``` -The values shown above are the defaults. `0` means the notification doesn't hide automatically. +The values shown above are the defaults. +`0` means the notification doesn't hide automatically. From 2c1ee6b9d57a23d8b6505cd8716870fbcfb1ca74 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 10:46:13 +0200 Subject: [PATCH 26/77] Fixes in 'configuration' section --- .../configuration/configuration.md | 3 +- .../configuration/dynamic_configuration.md | 2 +- .../configuration/repository_configuration.md | 40 +++++++++---------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/administration/configuration/configuration.md b/docs/administration/configuration/configuration.md index 9622d20ae9..9aa24dbbeb 100644 --- a/docs/administration/configuration/configuration.md +++ b/docs/administration/configuration/configuration.md @@ -53,7 +53,8 @@ Basic configuration handling in [[= product_name =]] is similar to what is commo You can define key/value pairs in your configuration files. Internally and by convention, keys follow a *dot syntax*, where the different segments follow your configuration hierarchy. -Keys are usually prefixed by a *namespace* corresponding to your application. All kinds of values are accepted, including arrays and deep hashes. +Keys are usually prefixed by a *namespace* corresponding to your application. +All kinds of values are accepted, including arrays and deep hashes. For configuration that is meant to be exposed to an end-user (or end-developer), it's usually a good idea to also [implement semantic configuration]([[= symfony_doc =]]/components/config/definition.html). diff --git a/docs/administration/configuration/dynamic_configuration.md b/docs/administration/configuration/dynamic_configuration.md index 574fd8ea67..09f9cfbf42 100644 --- a/docs/administration/configuration/dynamic_configuration.md +++ b/docs/administration/configuration/dynamic_configuration.md @@ -93,7 +93,7 @@ class Service { $this->configResolver = $configResolver; } - + public function someMethodThatNeedConfig() { $configValue = $this->configResolver->getParameter('my_param', 'myapp'); diff --git a/docs/administration/configuration/repository_configuration.md b/docs/administration/configuration/repository_configuration.md index f67951106a..c620fb07c2 100644 --- a/docs/administration/configuration/repository_configuration.md +++ b/docs/administration/configuration/repository_configuration.md @@ -1,16 +1,17 @@ --- -description: Configure Repository connections, archive limits, field groups and other settings. +description: Configure repository connections, archive limits, field groups and other settings. --- # Repository configuration -You can define several Repositories within a single application. However, you can only use one per site. +You can define several repositories within a single application. +However, you can only use one per site. ## Repository connection ### Using default values -To use the default Repository connection, you don't need to specify its details: +To use the default repository connection, you don't need to specify its details: ``` yaml ibexa: @@ -24,13 +25,13 @@ ibexa: !!! note "Legacy storage engine" - Legacy storage engine is the default storage engine for the Repository. + Legacy storage engine is the default storage engine for the repository. It uses [Doctrine DBAL](https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/) (Database Abstraction Layer). Database settings are supplied by [DoctrineBundle](https://github.com/doctrine/DoctrineBundle). As such, you can refer to [DoctrineBundle's documentation](https://github.com/doctrine/DoctrineBundle/blob/2.7.x/Resources/doc/configuration.rst#doctrine-dbal-configuration). -If no Repository is specified for a SiteAccess or SiteAccess group, the first Repository defined under `ibexa.repositories` is used: +If no repository is specified for a SiteAccess or SiteAccess group, the first repository defined under `ibexa.repositories` is used: ``` yaml ibexa: @@ -43,11 +44,11 @@ ibexa: # ... ``` -#### Multisite URI matching with multi-Repository setup +#### Multisite URI matching with multi-repository setup -You can use only one Repository (database) per domain. -This doesn't prohibit using [different Repositories](persistence_cache.md#multi-repository-setup) on different subdomains. -However, when using URI matching for multisite setup, all SiteAccesses sharing domain also need to share Repository. +You can use only one repository (database) per domain. +This doesn't prohibit using [different repositories](persistence_cache.md#multi-repository-setup) on different subdomains. +However, when using URI matching for multisite setup, all SiteAccesses sharing domain also need to share repository. For example: - `ibexa.co` domain can use `ibexa_repo` @@ -62,8 +63,7 @@ Invalid configuration causes problems for different parts of the system, for exa ### Entity manager -If you use the [Doctrine entity manager](https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/tutorials/getting-started.html#obtaining-the-entitymanager), -you're unable to connect different SiteAccesses to different databases. +If you use the [Doctrine entity manager](https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/tutorials/getting-started.html#obtaining-the-entitymanager), you're unable to connect different SiteAccesses to different databases. To have this possibility, you need to use the SiteAccess-aware entity manager: `ibexa.doctrine.orm.entity_manager`. @@ -84,12 +84,11 @@ For more information, see [DoctrineBundle documentation](https://symfony.com/doc !!! note - In contrast with DoctrineBundle, when using the SiteAccess-aware entity manager you need to explicitly set all options: - `dir` (it still accepts relative path in case of bundles), `prefix`, `type`, and `is_bundle`. + In contrast with DoctrineBundle, when using the SiteAccess-aware entity manager you need to explicitly set all options: `dir` (it still accepts relative path in case of bundles), `prefix`, `type`, and `is_bundle`. ### Defining custom connection -You can also explicitly define a custom Repository connection: +You can also explicitly define a custom repository connection: ``` yaml doctrine: @@ -167,7 +166,8 @@ repositories: default: content ``` -These identifiers can be given human-readable values and can be translated. Those values are used when editing content types. +These identifiers can be given human-readable values and can be translated. +Those values are used when editing content types. The translation domain is `ibexa_fields_groups`. This example in `translations/ibexa_fields_groups.en.yaml` defines English names for field groups: @@ -179,7 +179,7 @@ user_data: User data ## Limit of archived content versions -`default_version_archive_limit` controls the number of archived versions per content item that are stored in the Repository. +`default_version_archive_limit` controls the number of archived versions per content item that are stored in the repository. By default it's set to 5. This setting is configured in the following way (typically in `ibexa.yaml`): ``` yaml @@ -223,7 +223,7 @@ The command takes the following optional parameters: - `status` or `t` - status of versions to remove: `draft`, `archived` or `all` - `keep` or `k` - number of versions to keep -- `user` or `u` - the User that the command is performed as. The User must have the `content/remove`, `content/read` and `content/versionread` policies. By default the `administrator` user is applied. +- `user` or `u` - the User that the command is performed as. The user must have the `content/remove`, `content/read` and `content/versionread` policies. By default the `administrator` user is applied. - `excluded-content-types` - exclude versions of one or multiple content types from the cleanup procedure and separate multiple content types identifiers with the comma. `ibexa:content:cleanup-versions --status --keep --user --excluded-content-types article,blog_post` @@ -272,13 +272,13 @@ parameters: ## Repository-aware configuration -In your custom development, you can create Repository-aware configuration settings. +In your custom development, you can create repository-aware configuration settings. -This enables you to use different settings for different Repositories. +This enables you to use different settings for different repositories. !!! tip "SiteAccess-aware configuration" - If you need to use different settings per SiteAccess, not per Repository, see [SiteAccess-aware configuration](siteaccess_aware_configuration.md). + If you need to use different settings per SiteAccess, not per repository, see [SiteAccess-aware configuration](siteaccess_aware_configuration.md). To do this, create a parser that implements `Ibexa\Bundle\Core\DependencyInjection\Configuration\RepositoryConfigParserInterface`: From 048289e9b4544dd926fa5624526a0c7832cba9e0 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 11:04:10 +0200 Subject: [PATCH 27/77] Fixes in 'content organization' section --- .../content_organization/content_types.md | 7 ++-- .../content_organization/object_states.md | 2 +- .../content_organization/sections.md | 32 ++++++++++--------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/docs/administration/content_organization/content_types.md b/docs/administration/content_organization/content_types.md index 484d99c1ed..90bf47672f 100644 --- a/docs/administration/content_organization/content_types.md +++ b/docs/administration/content_organization/content_types.md @@ -24,14 +24,15 @@ For a detailed overview of the content model, see [Content model overview](conte Each content type is characterized by a set of metadata which define the general behavior of its instances: -**Name** – a user-friendly name that describes the content type. This name is used in the interface, but not internally by the system. +**Name** – a user-friendly name that describes the content type. +This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces, and special characters (it's mandatory and the maximum length is 255 characters). !!! note Even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), don't confuse it with this Name, which is a piece of metadata, not a field. -**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. +**Identifier** – an identifier for internal use in configuration files, templates, PHP code, etc. It must be unique, can only contain lowercase letters, digits, and underscores (it's mandatory and the maximum length is 50 characters). **Description** – a detailed description of the content type (optional). @@ -42,7 +43,7 @@ Each field identifier has to be surrounded with angle brackets. Text outside the angle brackets is included literally. If no pattern is provided, the system automatically uses the first field (optional). -**URL alias name pattern** – a pattern which controls how the virtual URLs of the Locations are generated when content items are created based on this content type. +**URL alias name pattern** – a pattern which controls how the virtual URLs of the locations are generated when content items are created based on this content type. Only the last part of the virtual URL is affected. The pattern works in the same way as the content name pattern. Text outside the angle brackets is converted using the selected method of URL transformation. diff --git a/docs/administration/content_organization/object_states.md b/docs/administration/content_organization/object_states.md index 876dd54779..4ca61ef2ce 100644 --- a/docs/administration/content_organization/object_states.md +++ b/docs/administration/content_organization/object_states.md @@ -2,7 +2,7 @@ description: Object states are user-defined states that can be assigned to content items. --- -## Object States +# Object States Object states are user-defined states that can be assigned to content items. they're contained in groups. diff --git a/docs/administration/content_organization/sections.md b/docs/administration/content_organization/sections.md index 218bd6ca78..2a2a369537 100644 --- a/docs/administration/content_organization/sections.md +++ b/docs/administration/content_organization/sections.md @@ -2,36 +2,38 @@ description: Sections are used to divide content items in the tree. --- -## Sections +# Sections Sections are used to divide content items in the tree into groups that are more manageable by content editors. -Division into Sections allows you, among others, to set [permissions](permission_overview.md) for only a part of the tree. +Division into sections allows you, among others, to set [permissions](permission_overview.md) for only a part of the tree. ![Sections screen](admin_panel_sections.png "Sections screen") -Technically, a Section is a number, a name, and an identifier. -Content items are placed in Sections by being assigned the Section ID. One item can be in only one Section. +Technically, a section is a number, a name, and an identifier. +Content items are placed in sections by being assigned the section ID. +One item can be in only one section. -When a new content item is created, its Section ID is set to the default Section (which is usually Standard). -When the item is published it is assigned to the same Section as its parent. -Because content must always be in a Section, unassigning happens by choosing a different Section to move it into. -If a content item has multiple Location assignments then it is always the Section ID of the item referenced by the parent of the main Location that is used. -In addition, if the main Location of a content item with multiple Location assignments is changed then the Section ID of that item is updated. +When a new content item is created, its section ID is set to the default section (which is usually Standard). +When the item is published it is assigned to the same section as its parent. +Because content must always be in a section, unassigning happens by choosing a different section to move it into. +If a content item has multiple location assignments then it is always the section ID of the item referenced by the parent of the main location that is used. +In addition, if the main location of a content item with multiple location assignments is changed then the section ID of that item is updated. -When content is moved to a different Location, the item itself and all of its subtree are assigned to the Section of the new Location. +When content is moved to a different location, the item itself and all of its subtree are assigned to the section of the new location. It works only for copy and move. -Assigning a new Section to a parent content item doesn't affect the subtree, meaning that subtree cannot currently be updated this way. +Assigning a new section to a parent content item doesn't affect the subtree, meaning that subtree cannot currently be updated this way. Sections can only be removed if no content items are assigned to them. Even then, it should be done carefully. -When a Section is deleted, it's only its definition itself that is removed. -Other references to the Section remain and thus the system most likely loses consistency. +When a section is deleted, it's only its definition itself that is removed. +Other references to the section remain and thus the system most likely loses consistency. !!! caution - Removing Sections may corrupt permission settings, template output and other things in the system. + Removing sections may corrupt permission settings, template output and other things in the system. -Section ID numbers aren't recycled. If a Section is removed, its ID number cannot be reused when a new Section is created. +Section ID numbers aren't recycled. +If a section is removed, its ID number cannot be reused when a new section is created. ### Registering users From cfc3b8dbe66b83a358e54d731a94a63cdfbd60a3 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 11:35:27 +0200 Subject: [PATCH 28/77] Fixes --- .../dashboard/configure_default_dashboard.md | 3 +-- docs/administration/recent_activity/recent_activity.md | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/administration/dashboard/configure_default_dashboard.md b/docs/administration/dashboard/configure_default_dashboard.md index 7d8fa52315..b373f2ec06 100644 --- a/docs/administration/dashboard/configure_default_dashboard.md +++ b/docs/administration/dashboard/configure_default_dashboard.md @@ -24,8 +24,7 @@ ibexa: container_content_type_identifier: folder ``` -Configuration can be set per [SiteAccess](multisite_configuration.md#siteaccess-configuration) -or [SiteAccess group](multisite_configuration.md#siteaccess-groups). +Configuration can be set per [SiteAccess](multisite_configuration.md#siteaccess-configuration) or [SiteAccess group](multisite_configuration.md#siteaccess-groups). All the settings in the configuration are reflected in the back office. diff --git a/docs/administration/recent_activity/recent_activity.md b/docs/administration/recent_activity/recent_activity.md index 7d9fcbbf4f..9ff3497970 100644 --- a/docs/administration/recent_activity/recent_activity.md +++ b/docs/administration/recent_activity/recent_activity.md @@ -45,8 +45,7 @@ For every exact hour, the cronjob line is: The [`activity_log/read`](policies.md#activity-log) policy gives a role the access to the **Admin** -> **Activity list**, the dashboard's **Recent activity** block, and the user profile's **Recent activity**. It can be limited to "Only own logs" ([`ActivityLogOwner`](limitation_reference.md#activitylogowner-limitation)). -The policy should be given to every roles having access to the back office, at least with the `ActivityLogOwner` owner limitation, -to allow them to use the "Recent activity" block in the [default dashboard](configure_default_dashboard.md) or their [custom dashboard](customize_dashboard.md). +The policy should be given to every roles having access to the back office, at least with the `ActivityLogOwner` owner limitation, to allow them to use the "Recent activity" block in the [default dashboard](configure_default_dashboard.md) or their [custom dashboard](customize_dashboard.md). This policy is required to view [activity log in user profile]([[= user_doc =]]/recent_activity/recent_activity/#user-profile), if [profile]([[= user_doc =]]/getting_started/get_started/#edit-user-profile) is enabled. !!! caution @@ -164,7 +163,7 @@ This stored name can be used at the time of displaying information whether the a #### Context group If you log several related entries at once, you can group them into a context. -Context is a set of actions done for the same purpose, for example, it could group the actions of a CRON that fetches third party data and updates Content items. +Context is a set of actions done for the same purpose, for example, it could group the actions of a CRON that fetches third party data and updates content items. The built-in contexts include: - `web` - groups actions made in the back office, like the update and the publishing of a new content item's version @@ -174,10 +173,10 @@ A context group counts as one item in regard to `activity_logs_limit` configurat To open a context group, use `ActivityLogService::prepareContext` which has two arguments: -- `$source` - describes, usually through a short identifier, what is triggering the set of actions. +- `$source` - describes, usually through a short identifier, what is triggering the set of actions. For example, some already existing sources are `web` (incl. actions from the back office), `graphql`, `rest` and `migration` - `$description` - an optional, more specific contextualisation. -For example, `migration` context source is associated with the migration file name in its context description +For example, `migration` context source is associated with the migration file name in its context description. To close a context group, use `ActivityLogService::dismissContext`. From 078e3cba437e4123dbb4d54d4b276a2a25a0d3b7 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 11:49:35 +0200 Subject: [PATCH 29/77] Fixes in'api' section --- docs/api/event_reference/event_reference.md | 6 ++--- docs/api/event_reference/other_events.md | 2 +- docs/api/event_reference/page_events.md | 6 ++--- docs/api/event_reference/section_events.md | 4 +-- .../event_reference/segmentation_events.md | 2 +- docs/api/graphql/graphql.md | 5 ++-- docs/api/graphql/graphql_custom_ft.md | 3 +-- docs/api/graphql/graphql_customization.md | 3 +-- docs/api/graphql/graphql_queries.md | 22 ++++++++-------- docs/api/php_api/php_api.md | 25 ++++++++++--------- docs/api/rest_api/rest_api_authentication.md | 6 +++-- .../rest_api/rest_api_usage/rest_requests.md | 2 +- .../rest_api/rest_api_usage/rest_responses.md | 4 +-- .../rest_api_usage/testing_rest_api.md | 7 +++--- 14 files changed, 46 insertions(+), 51 deletions(-) diff --git a/docs/api/event_reference/event_reference.md b/docs/api/event_reference/event_reference.md index 9bae388561..014b9afec0 100644 --- a/docs/api/event_reference/event_reference.md +++ b/docs/api/event_reference/event_reference.md @@ -8,11 +8,9 @@ page_type: reference [[= product_name =]] dispatches events during different actions. You can subscribe to these events to extend the functionality of the system. -In most cases, two events are dispatched for every action, -one before the action is completed, and one after. +In most cases, two events are dispatched for every action, one before the action is completed, and one after. -For example, copying a content item is connected with two events: -`BeforeCopyContentEvent` and `CopyContentEvent`. +For example, copying a content item is connected with two events: `BeforeCopyContentEvent` and `CopyContentEvent`. ``` php `SectionUpdateStruct $sectionUpdateStruct`
`Section|null $updatedSection`| |`UpdateSectionEvent`|`SectionService::updateSection`|`Section $section`
`SectionUpdateStruct $sectionUpdateStruct`
`Section $updatedSection`| -## Assigning Sections +## Assigning sections | Event | Dispatched by | Properties | |---|---|---| diff --git a/docs/api/event_reference/segmentation_events.md b/docs/api/event_reference/segmentation_events.md index 26f5ad3a6e..91967f6d4c 100644 --- a/docs/api/event_reference/segmentation_events.md +++ b/docs/api/event_reference/segmentation_events.md @@ -1,5 +1,5 @@ --- -description: Events that are triggered when working with Segments. +description: Events that are triggered when working with segments. page_type: reference --- diff --git a/docs/api/graphql/graphql.md b/docs/api/graphql/graphql.md index 9983e33a6f..1274a88e46 100644 --- a/docs/api/graphql/graphql.md +++ b/docs/api/graphql/graphql.md @@ -29,8 +29,7 @@ GraphQL schema cannot be generated for names that don't follow the [GraphQL spec This concerns image variations, content types, content type groups, product types, and field definition identifiers. It's recommended to rename the relevant identifiers. Failure to generate schema is registered in logs. -To find identifiers that aren't included in the schema, look for "Skipped schema generation" log messages, for example: -`Skipped schema generation for Image Variation`. +To find identifiers that aren't included in the schema, look for "Skipped schema generation" log messages, for example: `Skipped schema generation for Image Variation`. ## Domain schema @@ -44,7 +43,7 @@ With the queries you can inspect: - the existing types - details of content types, and their fields in the context of developing your own application -You can request additional content information such as the Section or Objects states, available under the `_info` field. +You can request additional content information such as the section or Objects states, available under the `_info` field. You can also query content type and content type group information through the `_info` and `_types` fields. diff --git a/docs/api/graphql/graphql_custom_ft.md b/docs/api/graphql/graphql_custom_ft.md index 2bee87bc74..30dc674d6d 100644 --- a/docs/api/graphql/graphql_custom_ft.md +++ b/docs/api/graphql/graphql_custom_ft.md @@ -47,8 +47,7 @@ Compiler pass example that should be placed in `src/DependencyInjection/Compiler ### Map with a custom `FieldDefinitionMapper` The `FieldDefinitionMapper` API uses service decorators. -To register your own mapper, make it decorate the -`Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\DecoratingFieldDefinitionMapper` service: +To register your own mapper, make it decorate the `Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\DecoratingFieldDefinitionMapper` service: ```yaml services: diff --git a/docs/api/graphql/graphql_customization.md b/docs/api/graphql/graphql_customization.md index 6a2c6aa5c1..5ebf97b4f0 100644 --- a/docs/api/graphql/graphql_customization.md +++ b/docs/api/graphql/graphql_customization.md @@ -12,8 +12,7 @@ You can use it if your application requires custom GraphQL resources, for instan To do so, create a `config/graphql/types/Query.types.yaml` file. It is used as the GraphQL query root. -In that file, add new fields that use any custom type or custom logic you require, based -on [overblog/GraphQLBundle](https://github.com/overblog/GraphQLBundle). +In that file, add new fields that use any custom type or custom logic you require, based on [overblog/GraphQLBundle](https://github.com/overblog/GraphQLBundle). The custom schema should be created only after generating other schemas to avoid problems, especially if the custom schema depends on other schema elements. For example, `Type "Domain" inherited by "Query" not found.`. diff --git a/docs/api/graphql/graphql_queries.md b/docs/api/graphql/graphql_queries.md index f46e604c29..e2476eabc4 100644 --- a/docs/api/graphql/graphql_queries.md +++ b/docs/api/graphql/graphql_queries.md @@ -10,7 +10,7 @@ You can query a single content item or a list of content items using fields defi ### Get a content item -To get a specific content item by its content ID, Location ID, or URL alias, use its relevant singular field, for example `article`, `folder`, or `image`. +To get a specific content item by its content ID, location ID, or URL alias, use its relevant singular field, for example `article`, `folder`, or `image`. ``` { @@ -44,10 +44,10 @@ Response: } ``` -You can request any Fields of the content item. In the example above, these are `title` and `author`. +You can request any fields of the content item. In the example above, these are `title` and `author`. You can also query the generic `item` object. -The `item` object references a content item, but you can also get its [Location information](#querying-locations). +The `item` object references a content item, but you can also get its [location information](#querying-locations). The query accepts `locationId`, `remoteId`, and `urlAlias` as arguments. ``` @@ -72,7 +72,7 @@ Response: #### Get language versions -To get Fields of a content item in a specific language, use the `language` argument. +To get fields of a content item in a specific language, use the `language` argument. The language must be configured for the current SiteAccess. ``` @@ -246,9 +246,9 @@ Response: You can get the Location object from any item by querying for `_location` or `_allLocations`. When you use `_location`, the API returns: -- the Location specified in the `locationId` or `urlAlias` argument -- the Location based on the current SiteAccess -- the main Location +- the location specified in the `locationId` or `urlAlias` argument +- the location based on the current SiteAccess +- the main location ``` { @@ -312,8 +312,7 @@ Response: ## Getting children of a Location -To get a [Location's](#querying-locations) children, -it's recommended to use the [Query Field](content_queries.md#content-query-field). +To get a [location's](#querying-locations) children, it's recommended to use the [Query field](content_queries.md#content-query-field). Alternatively, you can query the `children` property of an `item` or `content` object: @@ -607,7 +606,7 @@ To filter products based on attributes: } ``` - + If the attribute type (in this case, `measure`) cannot be found in the schema, the response is: ``` @@ -661,8 +660,7 @@ You can also query attributes by providing the attribute type: !!! note - You need to use aliases (for example, `sizeValue`) when querying attributes by the attribute type - due to the conflicting return types. + You need to use aliases (for example, `sizeValue`) when querying attributes by the attribute type due to the conflicting return types. Response: diff --git a/docs/api/php_api/php_api.md b/docs/api/php_api/php_api.md index 68c4927b93..af237b935f 100644 --- a/docs/api/php_api/php_api.md +++ b/docs/api/php_api/php_api.md @@ -7,14 +7,14 @@ page_type: reference The [public PHP API](../php_api_reference/) enables you to interact with [[= product_name =]]'s Repository and content model from your PHP code. -You can use it to create, read, update, manage, and delete all objects available in [[= product_name =]], namely content and related objects such as Sections, Locations, content types, or languages. +You can use it to create, read, update, manage, and delete all objects available in [[= product_name =]], namely content and related objects such as sections, locations, content types, or languages. The PHP API is built on top of a layered architecture, including a persistence SPI that abstracts storage. Using the API ensures that your code is forward compatible with future releases based on other storage engines. ## Using API services -The API provides access to Content, User, content types, and other features through various services. +The API provides access to content, user, content types, and other features through various services. The full list of available services covers: @@ -48,7 +48,7 @@ You can access the PHP API by injecting relevant services into your code: - By using [auto-wiring]([[=symfony_doc=]]/service_container/autowiring.html), and the service classname in the `Ibexa\Contracts` namespace (see `bin/console debug:autowiring | grep Ibexa.Contracts`). - By using [service parameters]([[=symfony_doc=]]/service_container.html#service-parameters), and service aliases (see `bin/console debug:autowiring | grep ibexa.api`). -- By using the Repository's `get[ServiceName]()` methods: [`Repository::getContentService()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Repository.html#method_getContentService), [`getUserService()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Repository.html#method_getUserService), etc. +- By using the repository's `get[ServiceName]()` methods: [`Repository::getContentService()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Repository.html#method_getContentService), [`getUserService()`](php_api_reference/classes/Ibexa-Contracts-Core-Repository-Repository.html#method_getUserService), etc. (Prefer injecting several Repository's dedicated services instead of the whole Repository if the Repository itself isn't needed.) !!! caution @@ -66,8 +66,8 @@ Value objects come with their own properties, such as `$content->id` or `$locati ### Creating and updating objects -Value objects fetch data from the Repository and are read-only. -To create and modify Repository values, use data structures, such as [`ContentService::newContentCreateStruct()`](https://github.com/ibexa/core/blob/v4.6.6/src/contracts/Repository/ContentService.php#L572) or [`LocationService::newLocationUpdateStruct()`](https://github.com/ibexa/core/blob/v4.6.6/src/contracts/Repository/LocationService.php#L238). +Value objects fetch data from the repository and are read-only. +To create and modify repository values, use data structures, such as [`ContentService::newContentCreateStruct()`](https://github.com/ibexa/core/blob/v4.6.6/src/contracts/Repository/ContentService.php#L572) or [`LocationService::newLocationUpdateStruct()`](https://github.com/ibexa/core/blob/v4.6.6/src/contracts/Repository/LocationService.php#L238). ### Value info objects @@ -84,7 +84,8 @@ For instance, `ContentInfo` contains `currentVersionNo` or `remoteId`, while `Co ## Authentication -One of the responsibilities of the Repository is user authentication. Every action is executed *as* a user. +One of the responsibilities of the repository is user authentication. +Every action is executed *as* a user. When using the PHP API, authentication is performed in three ways: @@ -94,9 +95,9 @@ When using the PHP API, authentication is performed in three ways: ### Back office authentication -When actions are performed through the back office, they're executed as the logged-in User. -This User's permissions affects the behavior of the repository. -The User may, for example, not be allowed to create content, or view a particular Section. +When actions are performed through the back office, they're executed as the logged-in user. +This user's permissions affects the behavior of the repository. +The user may, for example, not be allowed to create content, or view a particular section. ### Using `sudo()` @@ -117,9 +118,9 @@ $hiddenLocation = $repository->sudo(function (Repository $repository) use ($loca }); ``` -### Setting the Repository user +### Setting the repository user -In a command line script, the Repository runs as if executed by the anonymous user. +In a command line script, the repository runs as if executed by the anonymous user. While [using `sudo()`](#using-sudo) is the recommended option, you can also set the current user to a user with necessary permissions to achieve the same effect. To identify as a different user, you need to use the `UserService` together with `PermissionResolver` (in the example `admin` is the login of the administrator user): @@ -149,7 +150,7 @@ Each API method may throw different exceptions, depending on what it does. It's good practice to cover every exception you expect to happen. -For example if you're using a command which takes the Content ID as a parameter, the ID may either not exist, or the referenced content item may not be visible to the user. +For example if you're using a command which takes the content ID as a parameter, the ID may either not exist, or the referenced content item may not be visible to the user. Both cases should be covered with error messages: diff --git a/docs/api/rest_api/rest_api_authentication.md b/docs/api/rest_api/rest_api_authentication.md index 9d4aa73fa5..216beb7965 100644 --- a/docs/api/rest_api/rest_api_authentication.md +++ b/docs/api/rest_api/rest_api_authentication.md @@ -366,9 +366,11 @@ If the installation has a dedicated host for REST, you can enable HTTP basic aut * If the back office SiteAccess matches `//localhost/admin` (through `URIElement`, `Map\URI` or `Regex\URI`), it calls the REST API under `//localhost/api/ibexa/v2` because SiteAccess matching with REST isn't enabled at URL level. If you enable basic authentication for `pattern: ^/api/ibexa/v2` to use it in your front office across both production and development environments, your development environment's back office cannot work correctly. - This back office tries to access REST through the same URL as the front office. Even when logged in back office and using the [X-SiteAccess header](rest_requests.md#siteaccess), the firewall blocks access to REST as you're not logged through basic authentification. Therefore, some back office features don't work. + This back office tries to access REST through the same URL as the front office. + Even when logged in back office and using the [X-SiteAccess header](rest_requests.md#siteaccess), the firewall blocks access to REST as you're not logged through basic authentification. Therefore, some back office features don't work. - If basic authentication is used only for REST API, it's better to have a dedicated domain even on a development environment. For example, map an `api.localhost` in your `hosts` file and set the firewall for `host: ^api\.(example\.com|localhost)$`. + If basic authentication is used only for REST API, it's better to have a dedicated domain even on a development environment. + For example, map an `api.localhost` in your `hosts` file and set the firewall for `host: ^api\.(example\.com|localhost)$`. ### Usage example diff --git a/docs/api/rest_api/rest_api_usage/rest_requests.md b/docs/api/rest_api/rest_api_usage/rest_requests.md index 975668d4c2..9ddd3a20e5 100644 --- a/docs/api/rest_api/rest_api_usage/rest_requests.md +++ b/docs/api/rest_api/rest_api_usage/rest_requests.md @@ -191,7 +191,7 @@ Most [Sort Clauses](sort_clause_reference.md#sort-clauses) are available too. Th The search request has a `Content-Type: application/vnd.ibexa.api.ViewInput+xml` or `+json` header to specify the format of its body's payload. The root node is `` and it has two mandatory children: `` and ``. -You can add `version=1.1` to the `Content-Type` header to support the distinction between `ContentQuery` and `LocationQuery` instead of just `Query` which implicitly looks only for content items. +You can add `version=1.1` to the `Content-Type` header to support the distinction between `ContentQuery` and `LocationQuery` instead of `Query` which implicitly looks only for content items. The following examples search for `article` and `news` typed content items everywhere or for content items of all types directly under Location `123`. All those content items must be in the `standard` Section. diff --git a/docs/api/rest_api/rest_api_usage/rest_responses.md b/docs/api/rest_api/rest_api_usage/rest_responses.md index 3a9614ef66..a2268f239e 100644 --- a/docs/api/rest_api/rest_api_usage/rest_responses.md +++ b/docs/api/rest_api/rest_api_usage/rest_responses.md @@ -151,9 +151,7 @@ To enable CORS, add regular expression for an allowed domain using the `.env` va For example, to allow the JS test above to be executed alongside this page, you could add the following to an `.env` file (like the `.env.local`): `CORS_ALLOW_ORIGIN=^https?://doc.ibexa.co`. -To add several domains, filter on URIs, or change the default (like not allowing all the methods), -refer to [NelmioCorsBundle Configuration Documentation](https://symfony.com/bundles/NelmioCorsBundle/current/index.html#configuration) -to learn how to edit `config/packages/nelmio_cors.yaml`. +To add several domains, filter on URIs, or change the default (like not allowing all the methods), refer to [NelmioCorsBundle Configuration Documentation](https://symfony.com/bundles/NelmioCorsBundle/current/index.html#configuration) to learn how to edit `config/packages/nelmio_cors.yaml`. ## Response body diff --git a/docs/api/rest_api/rest_api_usage/testing_rest_api.md b/docs/api/rest_api/rest_api_usage/testing_rest_api.md index 058827af62..4c8ff8403c 100644 --- a/docs/api/rest_api/rest_api_usage/testing_rest_api.md +++ b/docs/api/rest_api/rest_api_usage/testing_rest_api.md @@ -10,7 +10,8 @@ Depending on how your browser understands XML, it either downloads the XML file, The following examples show how to interrogate the REST API using cURL, PHP or JS. -To test further, you can use browser extensions, like [Advanced REST client for Chrome](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo) or [RESTClient for Firefox](https://addons.mozilla.org/en-US/firefox/addon/restclient/), or dedicated tools. For command line users, [HTTPie](https://github.com/httpie/cli) is a good tool. +To test further, you can use browser extensions, like [Advanced REST client for Chrome](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo) or [RESTClient for Firefox](https://addons.mozilla.org/en-US/firefox/addon/restclient/), or dedicated tools. +For command line users, [HTTPie](https://github.com/httpie/cli) is a good tool. ## CLI @@ -48,7 +49,7 @@ To test it, copy-paste this code into your browser console alongside a page from ```javascript const resource = '/api/ibexa/v2/content/objects/52'; - + fetch(resource, { headers: {'Accept': 'application/vnd.ibexa.api.ContentInfo+json'}, }).then((response) => { @@ -64,7 +65,7 @@ To test it, copy-paste this code into your browser console alongside a page from ```javascript const resource = '/api/ibexa/v2/content/objects/52'; const request = new XMLHttpRequest(); - + request.open('GET', resource, true); request.setRequestHeader('Accept', 'application/vnd.ibexa.api.ContentInfo+json'); request.onload = function () { From 3dea47d855f34ad8003577b5e5776549efe68d25 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 12:00:06 +0200 Subject: [PATCH 30/77] Fixes in 'cdp' section --- docs/cdp/cdp_activation/cdp_configuration.md | 6 +++--- docs/cdp/cdp_data_customization.md | 4 ++-- docs/cdp/cdp_guide.md | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/cdp/cdp_activation/cdp_configuration.md b/docs/cdp/cdp_activation/cdp_configuration.md index ba9c2a11b7..cba8400133 100644 --- a/docs/cdp/cdp_activation/cdp_configuration.md +++ b/docs/cdp/cdp_activation/cdp_configuration.md @@ -56,11 +56,11 @@ Create a segment group in the back office. It serves as a container for all segments data generated by [[= product_name_cdp =]]. Go to **Admin** -> **Segments** and select **Create**. Fill in name and identifier for a segment group. -Choose wisely, as once connected to CDP Segment Group cannot be changed. +Choose wisely, as once connected to CDP segment group cannot be changed. -!!! caution "[[= product_name_cdp =]] Segment Group" +!!! caution "[[= product_name_cdp =]] segment group" - After you create the Segment Group in the back office and connect it to [[= product_name_cdp =]], you cannot change it in any way, including edit its name. + After you create the segment group in the back office and connect it to [[= product_name_cdp =]], you cannot change it in any way, including edit its name. ![Creating a new segment group](cdp_create_segment_group.png) diff --git a/docs/cdp/cdp_data_customization.md b/docs/cdp/cdp_data_customization.md index be0ff92c20..e2f8259135 100644 --- a/docs/cdp/cdp_data_customization.md +++ b/docs/cdp/cdp_data_customization.md @@ -5,13 +5,13 @@ edition: experience # Data customization ​ -You can customize Content and Product data exported to CDP and you can control what field type information you want to export. +You can customize 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 field types ​ -Field types are exported with metadata, for example, ID, Field Definition name, type, or value. +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` instance to extend metadata. The provided implementation has to be defined as a service and tagged with `ibexa.cdp.export.content.field_processor`. Additionally, you can specify `priority` to override the default behavior. diff --git a/docs/cdp/cdp_guide.md b/docs/cdp/cdp_guide.md index 61afc531f4..8527f4ce38 100644 --- a/docs/cdp/cdp_guide.md +++ b/docs/cdp/cdp_guide.md @@ -83,7 +83,7 @@ For more information, see [CDP data export](https://doc.ibexa.co/en/latest/cdp/c ​You can customize content and product data exported to [[= product_name_cdp =]] and control what field type information you want to export. With [[= product_name_cdp =]], you can export field types and field type values. -They're exported with metadata and attributes, for example, ID, Field Definition name, type, or value. +They're exported with metadata and attributes, for example, ID, field definition name, type, or value. For more information, see [data customization](https://doc.ibexa.co/en/latest/cdp/cdp_data_customization/#data-customization) documentation in Developer Documentation. @@ -114,7 +114,7 @@ Build extensive customer profiles that include their interactions, habits, and p ### Segment groups Provide a personalized customer experience, group your clients into specified audiences, and provide recommendations depending on the user data. -Create Segment groups to deliver personalized campaigns to boost engagement and conversion rates. +Create segment groups to deliver personalized campaigns to boost engagement and conversion rates. ### Audience Builder From 2bc4569f086a8bae9eda3bbf4376e1ef7025df52 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 12:08:40 +0200 Subject: [PATCH 31/77] Fixes in 'commerce' --- docs/commerce/cart/cart_api.md | 18 +++++++++--------- docs/commerce/checkout/checkout_api.md | 2 +- docs/commerce/checkout/customize_checkout.md | 8 ++++---- .../shipping_management/extend_shipping.md | 3 ++- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/commerce/cart/cart_api.md b/docs/commerce/cart/cart_api.md index 575d0246e2..66d2c97086 100644 --- a/docs/commerce/cart/cart_api.md +++ b/docs/commerce/cart/cart_api.md @@ -16,7 +16,7 @@ To get carts and work with them, use the `Ibexa\Contracts\Cart\CartServiceInterf - carts of registered users use database-based storage - anonymous user carts are stored in the PHP session -From the developer's perspective, carts and entries are referenced with a UUID identifier. +From the developer's perspective, carts and entries are referenced with a UUID identifier. ## Get single cart by identifier @@ -28,7 +28,7 @@ To access a single cart, use the `CartServiceInterface::getCart` method: ## Get multiple carts -To fetch multiple carts, use the `CartServiceInterface::findCarts` method. +To fetch multiple carts, use the `CartServiceInterface::findCarts` method. It follows the same search Query pattern as other APIs: ``` php @@ -51,8 +51,8 @@ To create a cart, use the `CartServiceInterface::createCart` method and provide ## Update cart metadata -You can update cart metadata after the cart is created. -You could do it to support a scenario when, for example, the user changes a currency and the cart should recalculate all item prices to a new currency. +You can update cart metadata after the cart is created. +You could do it to support a scenario when, for example, the user changes a currency and the cart should recalculate all item prices to a new currency. To update cart metadata, use the `CartServiceInterface::updateCartMetadata` method: ``` php @@ -95,9 +95,9 @@ To remove all products from the cart in a single operation, use the `CartService ## Check cart validity -Items in cart can become invalid, for example, when item price is unavailable in cart currency, or the product is no longer available. -To prevent checking out a cart with invalid items, check cart validity first. -To validate the cart, use the `CartServiceInterface::validateCart` method. +Items in cart can become invalid, for example, when item price is unavailable in cart currency, or the product is no longer available. +To prevent checking out a cart with invalid items, check cart validity first. +To validate the cart, use the `CartServiceInterface::validateCart` method. Validation is done with help from the `symfony/validator` component, and the method returns a `Symfony\Component\Validator\ConstraintViolationListInterface` object. ``` php @@ -108,7 +108,7 @@ Validation is done with help from the `symfony/validator` component, and the met ## Add entry to cart To add entries (products) to the cart, create an `Ibexa\Contracts\Cart\Value\EntryAddStruct`, where you specify the requested quantity of the product. -Then pass it to the `CartServiceInterface::addEntry` method: +Then pass it to the `CartServiceInterface::addEntry` method: ``` php [[= include_file('code_samples/api/commerce/src/Command/CartCommand.php', 11, 12) =]] @@ -132,7 +132,7 @@ To remove an entry from the cart, use the `CartServiceInterface::removeEntry` me ## Update entry metadata -Entries have their own metadata, for example, quantity. +Entries have their own metadata, for example, quantity. To change entry metadata, use the `CartServiceInterface::updateEntry` method and provide it with `Ibexa\Contracts\Cart\Value\EntryUpdateStruct`. ``` php diff --git a/docs/commerce/checkout/checkout_api.md b/docs/commerce/checkout/checkout_api.md index 2a66e649f2..b45f220587 100644 --- a/docs/commerce/checkout/checkout_api.md +++ b/docs/commerce/checkout/checkout_api.md @@ -11,7 +11,7 @@ With `CheckoutServiceInterface`, you manipulate checkouts that are stored in ses Checkouts are containers for the `Ibexa\Contracts\Cart\Value\CartInterface` object and all the data provided at each step of the [configurable checkout process](configure_checkout.md). The checkout process relies on Symfony Workflow, and you can customize each of its steps. -Each checkout step has its own controller that allows adding forms and external API calls that process data and pass them to `CheckoutService`. +Each checkout step has its own controller that allows adding forms and external API calls that process data and pass them to `CheckoutService`. Completing a step results in submitting a form and updating the current checkout object. At this point Symfony Workflow advances, the next controller takes over, and the whole process continues. diff --git a/docs/commerce/checkout/customize_checkout.md b/docs/commerce/checkout/customize_checkout.md index c6aaf415c4..5c5e679b15 100644 --- a/docs/commerce/checkout/customize_checkout.md +++ b/docs/commerce/checkout/customize_checkout.md @@ -48,7 +48,7 @@ To create a new workflow, for example, `seat_selection_checkout`, use the defaul [[= include_file('code_samples/front/shop/checkout/config/packages/checkout.yaml', 17, 19) =]] [[= include_file('code_samples/front/shop/checkout/config/packages/checkout.yaml', 38, 54) =]] ``` -Then, add a list of transitions. +Then, add a list of transitions. When defining a new transition, within its metadata, map the transition to its controller, and set other necessary details, such as the next step and label. ``` yaml hl_lines="2 12" @@ -280,11 +280,11 @@ ibexa: : checkout: #"billing" by default - billing_address_format: + billing_address_format: #"shipping" by default - shipping_address_format: + shipping_address_format: #used in registration, uses given shipping/billing addresses to pre-populate address forms in select_address checkout step, "customer" by default - customer_content_type: + customer_content_type: ``` Then, define custom address formats, which, for example, don't include the `locality` field: diff --git a/docs/commerce/shipping_management/extend_shipping.md b/docs/commerce/shipping_management/extend_shipping.md index f194bb1fea..8da9d82183 100644 --- a/docs/commerce/shipping_management/extend_shipping.md +++ b/docs/commerce/shipping_management/extend_shipping.md @@ -62,7 +62,8 @@ At this point you should be able to create a shipping method based on a custom s !!! note - To use this example, you must have regions. If you don't have regions, refer to [Enable purchasing products](enable_purchasing_products.md) for instructions on how to add them. + To use this example, you must have regions. + If you don't have regions, refer to [Enable purchasing products](enable_purchasing_products.md) for instructions on how to add them. ### Create options validator From 7b02cc262740b8983650b86cf8be832cf3993b98 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 12:25:11 +0200 Subject: [PATCH 32/77] Fixes in 'content management' section --- .../content_api/browsing_content.md | 4 +- .../content_api/managing_content.md | 81 ++++++++----------- .../content_management_api/section_api.md | 25 +++--- .../add_data_migration_matcher.md | 4 +- .../create_data_migration_action.md | 3 +- .../data_migration/data_migration.md | 6 +- .../data_migration/data_migration_actions.md | 23 +++--- .../data_migration/data_migration_api.md | 3 +- .../data_migration/exporting_data.md | 18 ++--- .../data_migration/importing_data.md | 49 ++++------- .../data_migration/managing_migrations.md | 24 +++--- 11 files changed, 95 insertions(+), 145 deletions(-) diff --git a/docs/content_management/content_api/browsing_content.md b/docs/content_management/content_api/browsing_content.md index 7e04dc9fbd..a765b32b25 100644 --- a/docs/content_management/content_api/browsing_content.md +++ b/docs/content_management/content_api/browsing_content.md @@ -122,7 +122,7 @@ To get the creator of the current version and not the content item's owner, you ### Section -You can find the Section to which a content item belongs through the [`getSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html#method_getSection) method of the ContentInfo object: +You can find the section to which a content item belongs through the [`getSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html#method_getSection) method of the ContentInfo object: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/ViewContentMetaDataCommand.php', 111, 112) =]] @@ -130,7 +130,7 @@ You can find the Section to which a content item belongs through the [`getSectio !!! note - Requesting Section data may be impossible for an anonymous user. + Requesting section data may be impossible for an anonymous user. Make sure to [authenticate](php_api.md#setting-the-repository-user) as a user with sufficient permissions. ### Object states diff --git a/docs/content_management/content_api/managing_content.md b/docs/content_management/content_api/managing_content.md index 35980bb19d..52a095a084 100644 --- a/docs/content_management/content_api/managing_content.md +++ b/docs/content_management/content_api/managing_content.md @@ -6,82 +6,70 @@ description: PHP API enables managing content Locations, content types, content ## Locations -You can manage [Locations](locations.md) that hold content -using [`LocationService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html). +You can manage [Locations](locations.md) that hold content using [`LocationService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html). !!! tip "Location REST API" - To learn how to manage Locations using the REST API, see [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-create-new-location-for-content-item). + To learn how to manage locations using the REST API, see [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-create-new-location-for-content-item). -### Adding a new Location to a content item +### Adding a new location to a content item -Every published content item must have at least one Location. -One content item can have more that one Location, which means it's presented in more than one place -in the content tree. +Every published content item must have at least one location. +One content item can have more that one location, which means it's presented in more than one place in the content tree. -Creating a new Location, like creating content, requires using a struct, -because a Location value object is read-only. +Creating a new location, like creating content, requires using a struct, because a location value object is read-only. -To add a new Location to existing content you need to create -a [`LocationCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LocationCreateStruct.html) -and pass it to the [`LocationService::createLocation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_createLocation) method: +To add a new location to existing content you need to create a [`LocationCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LocationCreateStruct.html) and pass it to the [`LocationService::createLocation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_createLocation) method: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/AddLocationToContentCommand.php', 50, 51) =]] [[= include_file('code_samples/api/public_php_api/src/Command/AddLocationToContentCommand.php', 55, 57) =]] ``` -`LocationCreateStruct` must receive the parent Location ID. -It sets the `parentLocationId` property of the new Location. +`LocationCreateStruct` must receive the parent location ID. +It sets the `parentLocationId` property of the new location. -You can also provide other properties for the Location, otherwise they are set to their defaults: +You can also provide other properties for the location, otherwise they are set to their defaults: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/AddLocationToContentCommand.php', 52, 54) =]] ``` -### Changing the main Location +### Changing the main location -When a content item has more that one Location, one Location is always considered the main one. -You can change the main Location using [`ContentService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentService.html), -by updating the `ContentInfo` with a [`ContentUpdateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentUpdateStruct.html) -that sets the new main Location: +When a content item has more that one location, one location is always considered the main one. +You can change the main location using [`ContentService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentService.html), by updating the `ContentInfo` with a [`ContentUpdateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentUpdateStruct.html) that sets the new main location: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SetMainLocationCommand.php', 48, 52) =]] ``` -### Hiding and revealing Locations +### Hiding and revealing locations -To hide or reveal (unhide) a Location you need to make use of -[`LocationService::hideLocation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_hideLocation) -or [`LocationService::unhideLocation`:](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_unhideLocation) +To hide or reveal (unhide) a location you need to make use of [`LocationService::hideLocation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_hideLocation) or [`LocationService::unhideLocation`:](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_unhideLocation) ``` php [[= include_file('code_samples/api/public_php_api/src/Command/HideLocationCommand.php', 46, 47) =]][[= include_file('code_samples/api/public_php_api/src/Command/HideLocationCommand.php', 49, 50) =]] ``` -See [Location visibility](locations.md#location-visibility) for detailed information -on the behavior of visible and hidden Locations. +See [location visibility](locations.md#location-visibility) for detailed information on the behavior of visible and hidden Locations. -### Deleting a Location +### Deleting a location -You can remove a Location either by deleting it, or sending it to Trash. +You can remove a location either by deleting it, or sending it to Trash. Deleting makes use of [`LocationService::deleteLocation()`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_deleteLocation). -It permanently deletes the Location, together with its whole subtree. +It permanently deletes the location, together with its whole subtree. -Content which has only this one Location is permanently deleted as well. -Content which has more Locations is still available in its other Locations. -If you delete the [main Location](#changing-the-main-location) of a content item that has more Locations, -another Location becomes the main one. +Content which has only this one location is permanently deleted as well. +Content which has more locations is still available in its other locations. +If you delete the [main location](#changing-the-main-location) of a content item that has more locations, another location becomes the main one. ``` php [[= include_file('code_samples/api/public_php_api/src/Command/DeleteContentCommand.php', 44, 45) =]] ``` -To send the Location and its subtree to Trash, -use [`TrashService::trash`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-TrashService.html#). +To send the location and its subtree to Trash, use [`TrashService::trash`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-TrashService.html#). Items in Trash can be later [restored, or deleted permanently](#trash). ``` php @@ -90,19 +78,17 @@ Items in Trash can be later [restored, or deleted permanently](#trash). ### Moving and copying a subtree -You can move a Location with its whole subtree using [`LocationService::moveSubtree`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_moveSubtree): +You can move a location with its whole subtree using [`LocationService::moveSubtree`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_moveSubtree): ``` php [[= include_file('code_samples/api/public_php_api/src/Command/MoveContentCommand.php', 46, 49) =]] ``` -[`LocationService::copySubtree`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_copySubtree) is used in the same way, -but it copies the Location and its subtree instead of moving it. +[`LocationService::copySubtree`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_copySubtree) is used in the same way, but it copies the location and its subtree instead of moving it. !!! tip - To copy a subtree you can also make use of the built-in `copy-subtree` command: - `bin/console ibexa:copy-subtree `. + To copy a subtree you can also make use of the built-in `copy-subtree` command: `bin/console ibexa:copy-subtree `. !!! note @@ -115,19 +101,18 @@ but it copies the Location and its subtree instead of moving it. To learn how to manage Trash using the REST API, see [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-list-trash-items). -To empty the Trash (remove all Locations in Trash), use [`TrashService::emptyTrash`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-TrashService.html#method_emptyTrash), -which takes no arguments. +To empty the Trash (remove all locations in Trash), use [`TrashService::emptyTrash`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-TrashService.html#method_emptyTrash), which takes no arguments. You can recover an item from Trash using [`TrashService::recover`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-TrashService.html#method_recover). You must provide the method with the ID of the object in Trash. -Trash Location is identical to the origin Location of the object. +Trash location is identical to the origin location of the object. ``` php [[= include_file('code_samples/api/public_php_api/src/Command/TrashContentCommand.php', 64, 65) =]] ``` -The content item is restored under its previous Location. -You can also provide a different Location to restore in as a second argument: +The content item is restored under its previous location. +You can also provide a different location to restore in as a second argument: ``` php $newParent = $this->locationService->loadLocation($location); @@ -170,8 +155,7 @@ To copy a content type, use [`ContentTypeService::copyContentType`](../../api/ph [[= include_file('code_samples/api/public_php_api/src/Command/CreateContentTypeCommand.php', 89, 90) =]] ``` -The copy is automatically getting an identifier based on the original content type identifier -and the copy's ID, for example: `copy_of_folder_21`. +The copy is automatically getting an identifier based on the original content type identifier and the copy's ID, for example: `copy_of_folder_21`. To change the identifier of the copy, use a [`ContentTypeUpdateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-ContentType-ContentTypeUpdateStruct.html): @@ -202,8 +186,7 @@ You can also get the first and last event in the list by using the `first()` and [[= include_file('code_samples/api/public_php_api/src/Command/CalendarCommand.php', 51, 53) =]] ``` -You can process the events in a collection using the `find(Closure $predicate)`, `filter(Closure $predicate)`, -`map(Closure $callback)` or `slice(int $offset, ?int $length = null)` methods of `EventCollection`, for example: +You can process the events in a collection using the `find(Closure $predicate)`, `filter(Closure $predicate)`, `map(Closure $callback)` or `slice(int $offset, ?int $length = null)` methods of `EventCollection`, for example: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CalendarCommand.php', 54, 57) =]] diff --git a/docs/content_management/content_management_api/section_api.md b/docs/content_management/content_management_api/section_api.md index b905648601..186415297c 100644 --- a/docs/content_management/content_management_api/section_api.md +++ b/docs/content_management/content_management_api/section_api.md @@ -1,39 +1,36 @@ --- -description: PHP API enables you to create Sections, assign content to them, and get various information about the Section. +description: PHP API enables you to create sections, assign content to them, and get various information about the section. --- # Section API -[Sections](sections.md) enable you to divide content into groups -which can later be used, for example, as basis for permissions. +[Sections](sections.md) enable you to divide content into groups which can later be used, for example, as basis for permissions. -You can manage Sections by using the PHP API by using `SectionService`. +You can manage sections by using the PHP API by using `SectionService`. !!! tip "Section REST API" - To learn how to manage Sections using the REST API, see [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-get-sections). + To learn how to manage sections using the REST API, see [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-get-sections). -## Creating Sections +## Creating sections -To create a new Section, you need to make use of the [`SectionCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-SectionCreateStruct.html) -and pass it to the [`SectionService::createSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SectionService.html#method_createSection) method: +To create a new section, you need to make use of the [`SectionCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-SectionCreateStruct.html) and pass it to the [`SectionService::createSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SectionService.html#method_createSection) method: -``` php +``` php [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 58, 62) =]] ``` -## Getting Section information +## Getting section information -You can use `SectionService` to retrieve Section information such as whether it's in use: +You can use `SectionService` to retrieve section information such as whether it's in use: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 76, 81) =]] ``` -## Listing content in a Section +## Listing content in a section -To list content items assigned to a Section you need to make a [query](search_api.md) -for content belonging to this section, by applying the [`SearchService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html). +To list content items assigned to a section you need to make a [query](search_api.md) for content belonging to this section, by applying the [`SearchService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html). You can also use the query to get the total number of assigned content items: ``` php diff --git a/docs/content_management/data_migration/add_data_migration_matcher.md b/docs/content_management/data_migration/add_data_migration_matcher.md index 976a5f11cc..7515fa3b56 100644 --- a/docs/content_management/data_migration/add_data_migration_matcher.md +++ b/docs/content_management/data_migration/add_data_migration_matcher.md @@ -5,15 +5,13 @@ description: Create a matcher for handling data migrations. # Create data migration matcher [Matchers in data migrations](exporting_data.md#match-property) enable you to select which data from the repository to export. - In addition to the built-in matchers, you can create custom matchers for content. -The following example creates a matcher for Section identifiers. +The following example creates a matcher for section identifiers. ## Create normalizer To do this, first add a normalizer which handles the conversion between objects and the YAML format used for data migration. - Matchers are instances of `FilteringCriterion`, so a custom normalizer needs to denormalize into an instance of `FilteringCriterion`. !!! tip "Normalizers" diff --git a/docs/content_management/data_migration/create_data_migration_action.md b/docs/content_management/data_migration/create_data_migration_action.md index 36d3f344c5..db80b4f553 100644 --- a/docs/content_management/data_migration/create_data_migration_action.md +++ b/docs/content_management/data_migration/create_data_migration_action.md @@ -37,8 +37,7 @@ And finally, add an executor to perform the action, in `src/Migrations/Action/As [[= include_file('code_samples/data_migration/src/Migrations/Action/AssignSectionExecutor.php') =]] ``` -Tag the executor with `ibexa.migrations.executor.action.` tag, where `` is the "type" of the step -that executor works with (`content`, `content_type`, `location`, and so on). +Tag the executor with `ibexa.migrations.executor.action.` tag, where `` is the "type" of the step that executor works with (for example, `content`, `content_type`, or `location`). The tag has to have a `key` property with the action type. ```yaml diff --git a/docs/content_management/data_migration/data_migration.md b/docs/content_management/data_migration/data_migration.md index 1c41409fa4..edc0c62786 100644 --- a/docs/content_management/data_migration/data_migration.md +++ b/docs/content_management/data_migration/data_migration.md @@ -12,9 +12,9 @@ Data migration allows exporting and importing selected data from an [[= product_ Between installation, you can migrate your repository data, for example, content items, content types, languages, object states, or sections. You can use migrations in projects that require the same data to be present across multiple instances. -They can be useful for project templates. Migrations are able to store shared data, so they can be applied for each new project you start, -or incrementally upgrade older projects to your new standard, if needed. -they're a developer-friendly tool that allows you to share data without writing code. +You can use them for project templates. +Migrations are able to store shared data, so they can be applied for each new project you start, or incrementally upgrade older projects to your new standard, if needed. +They're a developer-friendly tool that allows you to share data without writing code. You can run data migrations either with a command, or with the [PHP API](data_migration_api.md). diff --git a/docs/content_management/data_migration/data_migration_actions.md b/docs/content_management/data_migration/data_migration_actions.md index 016b3bc530..cd0bd9b800 100644 --- a/docs/content_management/data_migration/data_migration_actions.md +++ b/docs/content_management/data_migration/data_migration_actions.md @@ -17,12 +17,12 @@ You can find which migration steps support actions in the table below: | `user_group` |✔|✔|| | `company` |✔||| -Actions are optional operations that can be run after the main "body" of a migration has been executed -(that is, content has been created / updated, Object state has been added, and so on). +Actions are optional operations that can be run after the main "body" of a migration has been executed (for example, content has been created / updated, Object state has been added). Their purpose is to allow additional operations to be performed as part of this particular migration. -they're executed inside the same transaction, so in the event of failure they cause database rollback to occur. +They're executed inside the same transaction, so in the event of failure they cause database rollback to occur. For example, when updating a content type object, some fields might be removed: + ``` yaml - type: content_type @@ -64,9 +64,8 @@ The following migration actions are available out of the box: - `assign_user_group_to_role` (User group Create / Update) - `unassign_role_user_group` (User group Update) -In contrast with Kaliop migrations, actions provide you with ability to perform additional operations and extend -the migration functionality. -See [creating your own Actions](create_data_migration_action.md). +In contrast with Kaliop migrations, actions provide you with ability to perform additional operations and extend the migration functionality. +For more information, see [creating your own Actions](create_data_migration_action.md). ## Action usage examples @@ -131,14 +130,14 @@ mode: Create and Update mode: Create and Update ``` yaml - actions: - - + actions: + - action: assign_user_to_role identifier: foo - - + - action: assign_user_to_role id: 2 - - + - action: assign_user_to_role id: 2 limitation: @@ -158,7 +157,7 @@ mode: Create and Update - action: assign_user_group_to_role id: 2 - - + - action: assign_user_group_to_role id: 1 limitation: @@ -169,7 +168,7 @@ mode: Create and Update !!! note - In the `assign_user_group_to_role` action, Limitation type Section can only use Section ID. + In the `assign_user_group_to_role` action, limitation type section can only use section ID. mode: Update ``` yaml diff --git a/docs/content_management/data_migration/data_migration_api.md b/docs/content_management/data_migration/data_migration_api.md index 01e84812c1..e80225e725 100644 --- a/docs/content_management/data_migration/data_migration_api.md +++ b/docs/content_management/data_migration/data_migration_api.md @@ -8,8 +8,7 @@ You can use the PHP API to manage and run [data migrations](data_migration.md). ## Getting migration information -To list all migration files available in the directory defined in configuration (by default, `src/Migrations/Ibexa`), -use the `MigrationService:listMigrations()` method: +To list all migration files available in the directory defined in configuration (by default, `src/Migrations/Ibexa`), use the `MigrationService:listMigrations()` method: ``` php [[= include_file('code_samples/api/migration/src/Command/MigrationCommand.php', 30, 33) =]] diff --git a/docs/content_management/data_migration/exporting_data.md b/docs/content_management/data_migration/exporting_data.md index e54cdc7b60..3a9cf8bd18 100644 --- a/docs/content_management/data_migration/exporting_data.md +++ b/docs/content_management/data_migration/exporting_data.md @@ -9,8 +9,7 @@ To see an example of migrations in action, export data already present in your i To export repository content, use the `ibexa:migrations:generate` command. This command generates a YAML file with the requested part of the repository. -The file is located by default in the `src/Migrations/Ibexa/migrations` folder -or in [a custom folder that you configure](managing_migrations.md#migration-folders). +The file is located by default in the `src/Migrations/Ibexa/migrations` folder or in [a custom folder that you configure](managing_migrations.md#migration-folders). You can later use this file to import the data. ``` bash @@ -70,8 +69,7 @@ You can treat it as a template for another content item for user group. For example, you could: - Remove `references` if you don't intend to store IDs for future use (see [migration references](managing_migrations.md#references)) -- Remove `publicationDate`, `modificationDate`, `locationRemoteId`, - as those are generated if not passed (like in PHP API) +- Remove `publicationDate`, `modificationDate`, `locationRemoteId`, as those are generated if not passed (like in PHP API) - Add [`actions`](data_migration_actions.md) - Add fields for other languages present in the system. @@ -170,7 +168,7 @@ The following modes are available: - `create` - creates new items - `update` - updates an existing item. Only covers specified fields and properties. If the item doesn't exist, causes an error. -- `delete` - deletes an existing item. If the item doesn't exist, causes an error. +- `delete` - deletes an existing item. If the item doesn't exist, causes an error If you don't provide the `--mode` option, the command asks you to select the mode. @@ -292,15 +290,13 @@ php bin/console ibexa:migrations:generate --type=content --mode=create --file=my !!! note - When migrating multiple files at once (for example when calling `ibexa:migrations:migrate` without options), - they're executed in alphabetical order. + When migrating multiple files at once (for example when calling `ibexa:migrations:migrate` without options), they're executed in alphabetical order. ## user-context -The optional `--user-context` option enables you to run the export command as a specified User. -The command only exports repository data that the selected User has access to. -By default the admin account is used, unless specifically overridden by this option or in -bundle configuration (`ibexa_migrations.default_user_login`). +The optional `--user-context` option enables you to run the export command as a specified user. +The command only exports repository data that the selected user has access to. +By default the admin account is used, unless specifically overridden by this option or in bundle configuration (`ibexa_migrations.default_user_login`). ``` bash php bin/console ibexa:migrations:generate --type=content --mode=create --user-context=jessica_andaya diff --git a/docs/content_management/data_migration/importing_data.md b/docs/content_management/data_migration/importing_data.md index 8dfe1c67ee..40330abca9 100644 --- a/docs/content_management/data_migration/importing_data.md +++ b/docs/content_management/data_migration/importing_data.md @@ -10,9 +10,7 @@ To import data from YAML migration files into repository, you run the `ibexa:mig The `ibexa:migrations:import` command automatically places migration files in the correct folder. -Alternatively, you can place the files manually in the `src/Migrations/Ibexa/migrations` folder -or in [a custom folder that you configure](managing_migrations.md#migration-folders), -and specify the file name within this folder as parameter. +Alternatively, you can place the files manually in the `src/Migrations/Ibexa/migrations` folder or in [a custom folder that you configure](managing_migrations.md#migration-folders), and specify the file name within this folder as parameter. If you don't specify the file, all files within this directory are used. ``` bash @@ -20,17 +18,14 @@ php bin/console ibexa:migrations:migrate --file=my_data_export.yaml --siteaccess ``` Migrations store execution metadata in the `ibexa_migrations` database table. -This allows incremental upgrades: -the `ibexa:migrations:migrate` command ignores files that it had previously executed. +This allows incremental upgrades: the `ibexa:migrations:migrate` command ignores files that it had previously executed. The [`--siteaccess` option](exporting_data.md#siteaccess) usage can be relevant when multiple languages or multiple repositories are used. ## Migration step -A data migration step is a single operation in data migration process -that combines a mode (for example: `create`, `update`, `delete`) -and a type (for example: `content`, `section`, `currency`), -with optional additional information depending on the specific step. +A data migration step is a single operation in data migration process that combines a mode (for example: `create`, `update`, `delete`) +and a type (for example: `content`, `section`, `currency`), with optional additional information depending on the specific step. In a migration file, a step is an array item starting with the mandatory properties `type` and `mode`, for example: @@ -88,8 +83,7 @@ A repeatable migration performs the defined migration steps as many times as the !!! tip - You can use repeatable migration steps, for example, - to quickly generate large numbers of content items for testing purposes. + You can use repeatable migration steps, for example, to quickly generate large numbers of content items for testing purposes. You can vary the operations using the iteration counter. @@ -127,8 +121,7 @@ This step generates Field values with fake personal names. ### Expression syntax -You can use [Symfony expression syntax]([[= symfony_doc =]]/reference/formats/expression_language.html) in data migrations, -like in [repeatable steps](#repeatable-steps), where you can use it to generate varied content in migration steps. +You can use [Symfony expression syntax]([[= symfony_doc =]]/reference/formats/expression_language.html) in data migrations, like in [repeatable steps](#repeatable-steps), where you can use it to generate varied content in migration steps. The expression syntax uses the following structure: `### ###` @@ -189,8 +182,7 @@ Built-in expression language functions that are tagged with `ibexa.migrations.te #### Custom functions -To add custom functionality into Migration's expression language declare it as a service -and tag it with `ibexa.migrations.template.expression_language.function`. +To add custom functionality into Migration's expression language declare it as a service and tag it with `ibexa.migrations.template.expression_language.function`. Example: @@ -214,8 +206,7 @@ ibexa.migrations.template.faker: function: faker ``` -Service-based functions can be also added, but they must be callable, -requiring either an `__invoke` function or a wrapping service with one. +Service-based functions can be also added, but they must be callable, requiring either an `__invoke` function or a wrapping service with one. ## Migration examples @@ -223,11 +214,11 @@ The following examples show what data you can import using data migrations. ### Content types -The following example shows how to create a content type with two Field definitions. +The following example shows how to create a content type with two field definitions. The required metadata keys are: `identifier`, `mainTranslation`, `contentTypeGroups` and `translations`. -The default values of Field definition properties mirror the underlying PHP API, for example: +The default values of field definition properties mirror the underlying PHP API, for example: - `translatable` defaults to `true` - `required` defaults to `false` @@ -240,13 +231,10 @@ The default values of Field definition properties mirror the underlying PHP API, The following example shows how to create two content items: a folder and an article inside it. -When creating a content item, three metadata keys are required: -`contentType`, `mainTranslation`, and `parentLocationId`. +When creating a content item, three metadata keys are required: `contentType`, `mainTranslation`, and `parentLocationId`. -To use the Location ID of the folder, which is created automatically by the system, -you can use a [reference](managing_migrations.md#references). -In this case you assign the `parent_folder_location_id` reference name to the Location ID, -and then use it when creating the article. +To use the location ID of the folder, which is created automatically by the system, you can use a [reference](managing_migrations.md#references). +In this case you assign the `parent_folder_location_id` reference name to the location ID, and then use it when creating the article. ``` yaml hl_lines="15 24" [[= include_file('code_samples/data_migration/examples/create_parent_and_child_content.yaml') =]] @@ -254,8 +242,7 @@ and then use it when creating the article. ### Images -The following example shows how to migrate an `example-image.png` located in -`public/var/site/storage/images/3/8/3/0/383-1-eng-GB` without manually placing it in the appropriate path. +The following example shows how to migrate an `example-image.png` located in `public/var/site/storage/images/3/8/3/0/383-1-eng-GB` without manually placing it in the appropriate path. To prevent the manual addition of images to specific DFS or local locations, such as `public/var/site/storage/images/` you can move image files to, for example `src/Migrations/images`. Adjust the migration file and configure the `image` field data as follows: @@ -269,9 +256,7 @@ Adjust the migration file and configure the `image` field data as follows: path: src/Migrations/images/example-image.png ``` -This migration copies the image to the appropriate directory, -in this case `public/var/site/storage/images/3/8/3/0/254-1-eng-GB/example-image.png`, -enabling swift file migration regardless of storage (local, DFS). +This migration copies the image to the appropriate directory, in this case `public/var/site/storage/images/3/8/3/0/254-1-eng-GB/example-image.png`, enabling swift file migration regardless of storage (local, DFS). ### Roles @@ -365,7 +350,7 @@ The following example shows how to create a product type. The main part of the migration file is the same as when creating a regular content type. -A product type must also contain the definition for an `ibexa_product_specification` Field. +A product type must also contain the definition for an `ibexa_product_specification` field. `fieldSettings` contains information about the product attributes. ``` yaml @@ -396,7 +381,7 @@ The following example creates an image [content item](#content-items) from a loc [[= include_file('code_samples/data_migration/examples/create_product_asset.yaml') =]] ``` -This migration uses a [reference](managing_migrations.md#references) to store the created image Content ID, and then uses it while creating the asset. +This migration uses a [reference](managing_migrations.md#references) to store the created image content ID, and then uses it while creating the asset. It uses an [expression syntax](#expression-syntax) to [concat (`~`)]([[= symfony_doc =]]/reference/formats/expression_language.html#string-operators) the mandatory scheme `ezcontent://` and the image content ID through the [`reference` function](#built-in-functions) used on the reference's name. diff --git a/docs/content_management/data_migration/managing_migrations.md b/docs/content_management/data_migration/managing_migrations.md index 0a1223b905..c719ae8194 100644 --- a/docs/content_management/data_migration/managing_migrations.md +++ b/docs/content_management/data_migration/managing_migrations.md @@ -7,9 +7,7 @@ month_change: true ## Converting migration files -If you want to convert a file from the format used by the -[Kaliop migration bundle](https://github.com/kaliop-uk/ezmigrationbundle) -to the current migration format, use the `ibexa:migrations:kaliop:convert` command. +If you want to convert a file from the format used by the [Kaliop migration bundle](https://github.com/kaliop-uk/ezmigrationbundle) to the current migration format, use the `ibexa:migrations:kaliop:convert` command. The source file must use Kaliop mode and type combinations. The converter handles Kaliop types that are different from [[= product_name_base =]] types. @@ -28,8 +26,7 @@ If you don't specify the output folder, the command overwrites the input files. ## Adding migration files -Use the `ibexa:migrations:import` command to add files to the migration folder defined in configuration -(by default, `src/Migrations/Ibexa/migrations`). +Use the `ibexa:migrations:import` command to add files to the migration folder defined in configuration (by default, `src/Migrations/Ibexa/migrations`). ``` bash php bin/console ibexa:migrations:import my_data_export.yaml @@ -37,8 +34,7 @@ php bin/console ibexa:migrations:import my_data_export.yaml ## Checking migration status -To check the status of migration files in the migration folder defined in configuration, -run the following command: +To check the status of migration files in the migration folder defined in configuration, run the following command: ``` bash php bin/console ibexa:migrations:status @@ -85,11 +81,10 @@ bin/console config:dump-reference ibexa_migrations References are key-value pairs necessary when one migration depends on another. -Since some migrations generate object properties (like IDs) during their execution, which cannot be known in advance, -references provide migrations with the ability to use previously created object properties in further migrations. +Since some migrations generate object properties (like IDs) during their execution, which cannot be known in advance, references provide migrations with the ability to use previously created object properties in further migrations. They can be subsequently used by passing them in their desired place with `reference:` prefix. -The example below creates a content item of type "folder", and stores its Location path as `"ref_path__folder__media"`. +The example below creates a content item of type "folder", and stores its location path as `"ref_path__folder__media"`. Then this reference is reused as part of a new role, as a limitation. ```yaml @@ -142,14 +137,13 @@ Then this reference is reused as part of a new role, as a limitation. ``` -By default, reference files are located in a separate directory `src/Migrations/Ibexa/references` -(see [previewing reference](#preview-configuration) -`ibexa_migrations.migration_directory` and `ibexa_migrations.references_files_subdir` options). +By default, reference files are located in a separate directory `src/Migrations/Ibexa/references` (for more information, see [previewing reference](#preview-configuration) `ibexa_migrations.migration_directory` and `ibexa_migrations.references_files_subdir` options). -Reference files are **NOT** loaded by default. A separate step (type: "reference", mode: "load", with filename as "value") -is required. Similarly, saving a reference file is done using type: "reference", mode: "save" step, with filename. +Reference files are **NOT** loaded by default. A separate step (type: "reference", mode: "load", with filename as "value") is required. +Similarly, saving a reference file is done using type: "reference", mode: "save" step, with filename. For example: + ```yaml - type: reference From 710d12b2dd47b3e9b95c41bc8f45818261532592 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 14:00:05 +0200 Subject: [PATCH 33/77] Fixes in 'customer management' --- docs/customer_management/cp_applications.md | 21 ++---- docs/customer_management/cp_configuration.md | 23 ++---- docs/customer_management/cp_page_builder.md | 24 +++--- .../create_user_registration_form.md | 3 +- docs/customer_management/customer_portal.md | 8 +- .../customer_portal_guide.md | 73 +++++++++---------- 6 files changed, 64 insertions(+), 88 deletions(-) diff --git a/docs/customer_management/cp_applications.md b/docs/customer_management/cp_applications.md index 74e08b496a..8c88e1ad4a 100644 --- a/docs/customer_management/cp_applications.md +++ b/docs/customer_management/cp_applications.md @@ -7,8 +7,7 @@ edition: experience New business customers can apply for a company account. Applications go through the approval process in the back office where they can be accepted, rejected or put on hold. -If they're accepted, the business partner receives an invitation link to the Customer Portal, -where they can set up their team and manage their account. +If they're accepted, the business partner receives an invitation link to the Customer Portal, where they can set up their team and manage their account. For more information on company self-registration, see [user guide documentation](https://doc.ibexa.co/projects/userguide/en/latest/customer_management/company_self_registration/). If provided options are too limited, you can customize an approval process by yourself. @@ -27,8 +26,7 @@ Below, you can find possible configurations for Customer Portal applications. ### Reasons for rejecting application -To change or add reasons for not accepting Corporate Portal application go to -`vendor/ibexa/corporate-account/src/bundle/Resources/config/default_settings.yaml`. +To change or add reasons for not accepting Corporate Portal application go to `vendor/ibexa/corporate-account/src/bundle/Resources/config/default_settings.yaml`. ```yaml parameters: @@ -39,8 +37,7 @@ parameters: ### Timeout -Registration form locks for 5 minutes after unsuccessful registration, -if the user, for example, tried to use an email address that already exists in a Customer Portal clients database. +Registration form locks for 5 minutes after unsuccessful registration, if the user, for example, tried to use an email address that already exists in a Customer Portal clients database. To change that duration, go to `config/packages/ibexa.yaml`. ```yaml @@ -59,8 +56,7 @@ In this procedure, you add a new status to the approval process of business acco ### Add new status -First, under the `ibexa.system..corporate_accounts.application.states` -add a `verify` status to the [configuration](configuration.md#configuration-files): +First, under the `ibexa.system..corporate_accounts.application.states` add a `verify` status to the [configuration](configuration.md#configuration-files): ```yaml [[= include_file('code_samples/customer_portal/config/packages/customer_portal.yaml') =]] @@ -90,8 +86,7 @@ In line 39, you can see the `verify_form` parameter that passes the `verify` for ### Add form template -To be able to see the changes you need to add -a new template `templates/themes/admin/corporate_account/application/details.html.twig`. +To be able to see the changes you need to add a new template `templates/themes/admin/corporate_account/application/details.html.twig`. ``` html+twig [[= include_file('code_samples/customer_portal/templates/themes/admin/corporate_account/application/details.html.twig') =]] @@ -105,10 +100,8 @@ Select one application from the list and inspect application review view for a n ### Create event subscriber to verify state -Now, you need to pass the information that the button has been selected -to the list of applications to change the application status. -Create another event subscriber that passes the information -from the created form to the application list `src/Corporate/EventSubscriber/VerifyStateEventSubscriber.php`. +Now, you need to pass the information that the button has been selected to the list of applications to change the application status. +Create another event subscriber that passes the information from the created form to the application list `src/Corporate/EventSubscriber/VerifyStateEventSubscriber.php`. ``` php hl_lines="42 68" [[= include_file('code_samples/customer_portal/src/Corporate/EventSubscriber/VerifyStateEventSubscriber.php') =]] diff --git a/docs/customer_management/cp_configuration.md b/docs/customer_management/cp_configuration.md index d615d19d00..1c9d52d532 100644 --- a/docs/customer_management/cp_configuration.md +++ b/docs/customer_management/cp_configuration.md @@ -5,15 +5,12 @@ edition: experience # Customer Portal configuration -You can overwrite the default configuration of the Customer Portal -to fit its capabilities to the unique needs of your business. +You can overwrite the default configuration of the Customer Portal to fit its capabilities to the unique needs of your business. ## `corporate` SiteAccess -The predefined `corporate` SiteAccess in `corporate_group` -(configured in `config/packages/ibexa.yaml`) serves the Customer Portal. -If you need a multisite setup with multiple Customer Portals, -add any additional SiteAccesses to `corporate_group`. +The predefined `corporate` SiteAccess in `corporate_group` (configured in `config/packages/ibexa.yaml`) serves the Customer Portal. +If you need a multisite setup with multiple Customer Portals, add any additional SiteAccesses to `corporate_group`. ## Customer identifier @@ -28,8 +25,7 @@ ibexa: ## Roles and policies -You can add custom roles to your installation -by listing them under the `ibexa.site_access.config.default.corporate_accounts.roles` [configuration](configuration.md#configuration-files). +You can add custom roles to your installation by listing them under the `ibexa.site_access.config.default.corporate_accounts.roles` [configuration](configuration.md#configuration-files). This key overwrites the default list set in `vendor/ibexa/corporate-account/src/bundle/Resources/config/default_settings.yaml` (the following example redeclares them for clarity): ```yaml @@ -44,12 +40,10 @@ You can do it per SiteAccess or SiteAccess group by using [SiteAccess-aware conf ## Content type names -You can change names of default content types by assigning what -content types should be used to describe `Company` and `Member` in the back office. +You can change names of default content types by assigning what content types should be used to describe `Company` and `Member` in the back office. Proceed only if you already have a `Company` content type in your system, and you don't want to change its identifier. -Configuration for content type names is placed under the `ibexa_corporate_account` key, -like shown in `Ibexa\Bundle\CorporateAccount\DependencyInjection\Configuration`. +Configuration for content type names is placed under the `ibexa_corporate_account` key, like shown in `Ibexa\Bundle\CorporateAccount\DependencyInjection\Configuration`. To change content type names, adjust corporate account configuration in the following way: ```yaml @@ -75,8 +69,7 @@ To learn more, see [Address field type documentation](addressfield.md). ## Templates -You can also define new templates for, among others: invitation email, -reset password message and the information screens after any of the user's actions. +You can also define new templates for, among others: invitation email, reset password message and the information screens after any of the user's actions. ```yaml ibexa: @@ -92,7 +85,7 @@ ibexa: ## Order management -Reviewing pending and past orders in Customer Portal requires that you configure all currencies that any of the customers may use under the `ibexa.system..product_catalog.currencies` key. +Reviewing pending and past orders in Customer Portal requires that you configure all currencies that any of the customers may use under the `ibexa.system..product_catalog.currencies` key. The first currency from the list is then used for filtering the orders list and calculating the **Average order** and **Total amount** values. For more information, see [Enable purchasing products](enable_purchasing_products.md). \ No newline at end of file diff --git a/docs/customer_management/cp_page_builder.md b/docs/customer_management/cp_page_builder.md index b91475a66a..8a1c0244e5 100644 --- a/docs/customer_management/cp_page_builder.md +++ b/docs/customer_management/cp_page_builder.md @@ -12,7 +12,7 @@ First, you need to decide if you want to create and configure [one portal](#crea ## Create and configure one portal -This setup is recommended for simple use cases with one Customer Portal for all markets. +This setup is recommended for use cases with one Customer Portal for all markets. If you plan to expand your portal portfolio in the future, see [multiple portal configuration](#create-and-configure-multiple-portals). ### Configure Page Builder access to Customer Portal @@ -26,8 +26,7 @@ Next, click **Publish** to see the page in the content tree. ![Add name and description to Customer Portal](img/cp_name_description.png) To be able to see the Customer Portal site template in the Page Builder you need to add `custom_portal` SiteAccess to the configuration. -First, under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files) add `custom_portal` to -the SiteAccess `list` and to `corporate_group`. +First, under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files) add `custom_portal` to the SiteAccess `list` and to `corporate_group`. Next, add configuration for `corporate_group` and `custom_portal` under `ibexa.system`. Remember to specify `location_id` of your Customer Portal, you can find it under the **Technical details** tab of your new page. @@ -40,7 +39,7 @@ ibexa: - site - admin - corporate - - custom_portal + - custom_portal groups: site_group: [import, site] storefront_group: [site] @@ -86,7 +85,8 @@ If members of the company don't have sufficient permissions for any Customer Por !!! note - Customer Portal is only available to users that are members of the company. Even if a user has all the sufficient permissions but isn't a member of a company, they can't see the Customer Portal. + Customer Portal is only available to users that are members of the company. + Even if a user has all the sufficient permissions but isn't a member of a company, this user cannot see the Customer Portal. ## Create and configure multiple portals @@ -94,8 +94,7 @@ This setup is recommended for global markets or company specific portals, where ### Customer Portal container -First, you need to create a root folder for Customer Portals, -its location ID needs to be later specified in the configuration as [a tree root](multisite_configuration.md#location-tree). +First, you need to create a root folder for Customer Portals, its location ID needs to be later specified in the configuration as [a tree root](multisite_configuration.md#location-tree). To do it, go to **Content** -> **Content structure**, and select **Create content**. There you can see two possibilities **Customer Portal** and **Customer Portal Page**. @@ -111,8 +110,7 @@ Select **Customer Portal**, define its name and publish. ### Configure Page Builder access to Customer Portal To be able to see Customer Portal site template in the Page Builder you need to add `custom_portal` SiteAccess to the configuration. -First, under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files), add `custom_portal` to -the SiteAccess `list` and to `corporate_group`. +First, under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files), add `custom_portal` to the SiteAccess `list` and to `corporate_group`. Next, add configuration for `corporate_group` and `custom_portal` under `ibexa.system`. Remember to specify `location_id` of the root folder for Customer Portals, you can find it under the **Technical details** tab. @@ -125,7 +123,7 @@ ibexa: - site - admin - corporate - - custom_portal + - custom_portal groups: site_group: [import, site] storefront_group: [site] @@ -155,12 +153,12 @@ ibexa: ``` Now, you can go back to your Customer Portal's container. -All Landing Pages that you create in it use Customer Portal template. +All landing pages that you create in it use Customer Portal template. ### Assign portal to Customer Group You can assign multiple Customer Portal containers or Pages to a specific Customer Group. -First, you need to grant the following permissions to company members from the Customer Group: +First, you need to grant the following permissions to company members from the Customer Group: - `user/login` to `custom_portal` SiteAccess - `content/read` to selected Customer Portals @@ -172,7 +170,7 @@ If members of the Customer Group don't have sufficient permissions for any Custo !!! note Customer Portal is only available to users that are members of the company. - Even if user has all the sufficient permissions but isn't a member of a company, cannot see the Customer Portal. + Even if user has all the sufficient permissions but isn't a member of a company, this user cannot see the Customer Portal. #### Build-in portal mapping diff --git a/docs/customer_management/create_user_registration_form.md b/docs/customer_management/create_user_registration_form.md index c8d3685123..7f82c75417 100644 --- a/docs/customer_management/create_user_registration_form.md +++ b/docs/customer_management/create_user_registration_form.md @@ -11,8 +11,7 @@ First, make sure you [enabled user registration](permission_use_cases.md#registe ## Configure existing form -In your configuration, under `allowed_field_definitions_identifiers` [configuration key](configuration.md#configuration-files), -specify the fields that should be part of your registration form. +In your configuration, under `allowed_field_definitions_identifiers` [configuration key](configuration.md#configuration-files), specify the fields that should be part of your registration form. You can also define what kind of user you want to create under `user_type_identifier`, for example, frontend user. To learn more about available users, see [user types documentation](user_registration.md#user-types). diff --git a/docs/customer_management/customer_portal.md b/docs/customer_management/customer_portal.md index 5baa756ae1..bdb1520efb 100644 --- a/docs/customer_management/customer_portal.md +++ b/docs/customer_management/customer_portal.md @@ -6,13 +6,11 @@ page_type: landing_page # Customer Portal -A Customer Portal serves as a central entry point to your services and products. +A Customer Portal serves as a central entry point to your services and products. It helps you provide a unique user experience with a single point of access to any relevant self-service options for your products and services. -[[= product_name =]] Customer Portal and customer management that ships with it let you create and handle business accounts -and communicate with your partners in a personalized space. -With this feature, your customers can self-register, edit their organization information, -invite and view members, check their order history and more. +[[= product_name =]] Customer Portal and customer management that ships with it let you create and handle business accounts and communicate with your partners in a personalized space. +With this feature, your customers can self-register, edit their organization information, invite and view members, check their order history, and more. [[= cards([ "customer_management/customer_portal_guide", diff --git a/docs/customer_management/customer_portal_guide.md b/docs/customer_management/customer_portal_guide.md index de60c6e550..77e7178248 100644 --- a/docs/customer_management/customer_portal_guide.md +++ b/docs/customer_management/customer_portal_guide.md @@ -7,13 +7,11 @@ edition: experience ## What is Customer Portal -A Customer Portal serves as a central entry point to your services and products. +A Customer Portal serves as a central entry point to your services and products. It helps you provide a unique user experience with a single point of access to any relevant self-service options for your products and services. -[[= product_name =]] Customer Portal and customer management that ships with it let you create and handle business accounts -and communicate with your partners in a personalized space. -With this feature, your customers can self-register, edit their organization information, -invite and view members, check their order history and more. +[[= product_name =]] Customer Portal and customer management that ships with it let you create and handle business accounts and communicate with your partners in a personalized space. +With this feature, your customers can self-register, edit their organization information, invite and view members, check their order history, and more. ## Availability @@ -21,7 +19,7 @@ Customer Portal is available in [[= product_name_exp =]]. It's also compatible w ## How does Customer Portal work? -Customer Portal is a component based on content types. +Customer Portal is a component based on content types. This means that [[= product_name =]] provides containers, user management, content management, so you can focus on business logic and general outlook of the portal for your B2B clients. ### Customer Portal @@ -35,10 +33,9 @@ With user differentiation, company buyers can only purchase products while compa Custom Customer Portal can be created and edited in Page Builder to meet the needs of each business type, company, or market they operate on. -To create a new Customer Portal, go to Content and, from the menu, select Content structure. -There, navigate to the root container for your Customer Portals and select Customer Portal Page. -In the Page Builder creation box, you see the Customer Portal layout where you can add a dedicated Customer Portal block, -Sales Representative, or choose from a selection of blocks available to your [[= product_name =]] version. +To create a new Customer Portal, go to **Content** and, from the menu, select **Content structure**. +There, navigate to the root container for your Customer Portals and select **Customer Portal Page**. +In the Page Builder creation box, you see the Customer Portal layout where you can add a dedicated Customer Portal block, Sales Representative, or choose from a selection of blocks available to your [[= product_name =]] version. If the built-in page blocks aren't sufficient to fulfill your needs, you can add your own. ![Editable in Page Builder](img/cp_edit_in_page_builder.png) @@ -59,15 +56,15 @@ The main company management takes place in the back office where each company ha ![Companies section in back office](img/cp_back_office.png) -From there, they can activate and deactivate the company, edit its information, invite members, manage their roles and edit their basic information. +From there, they can activate and deactivate the company, edit its information, invite members, manage their roles, and edit their basic information. -In the roles section, you can define policies for each user group, for example, a Company buyer. +In the roles section, you can define policies for each user group, for example, a Company buyer. You can also set up policies for every user who has a business account by editing a Corporate Access role. ### Members -Company members aren't standard users. They belong to a separate category called Corporate Accounts. -This category is located in **Admin** -> **Corporate** -> **Corporate Accounts**. +Company members aren't standard users. They belong to a separate category called Corporate Accounts. +This category is located in **Admin** -> **Corporate** -> **Corporate Accounts**. There, you can find a list of companies and their members. This feature comes with a set of new roles: @@ -87,36 +84,37 @@ Members can be invited to the organization from: - the Customer Portal: go to your company admin profile, select **Members** -> **Invite members** -Then, in a pop-up fill out email addresses one by one, or use drag and drop to upload a file with a list of emails. -You also have to assign a role to each new member from a drop-down list. +Then, in a pop-up fill out email addresses one by one, or use drag and drop to upload a file with a list of emails. +You also have to assign a role to each new member from a drop-down list. Click **Send** to send out invitations. ![Invitations](img/cp_invitations.png) -Invited users receive an email message with a registration link. +Invited users receive an email message with a registration link. With it, they can register and create their account in the Customer Portal. ![Create account](img/cp_create_account.png) ### Company self-registration -Self-registration allows business customers to take charge and apply for a business account by themselves. -Applications go through the approval process in the back office where they can be accepted, rejected or put on hold. +Self-registration allows business customers to take charge and apply for a business account by themselves. +Applications go through the approval process in the back office where they can be accepted, rejected or put on hold. If they're accepted, the business partner receives an invitation link to the Customer Portal, where they can set up their team and manage their account. -To apply for a business account, a company needs to provide their basic information, -contact information and billing address in an application. +To apply for a business account, a company needs to provide their basic information, contact information and billing address in an application. ![Company self-registration](img/cp_registration.png) -The approval process is customizable. You can decide which user has approval rights by granting them `Company Application/Workflow` policy, -you can also decide between which states the user may move applications: +The approval process is customizable. +You can decide which user has approval rights by granting them `Company Application/Workflow` policy, you can also decide between which states the user may move applications: - on hold - accept - reject -If built-in statuses aren't sufficient, you can add custom ones. You can also edit or add reasons for not accepting the company application. Finally, you can customize the registration site itself. +If built-in statuses aren't sufficient, you can add custom ones. +You can also edit or add reasons for not accepting the company application. +Finally, you can customize the registration site itself. ### REST API @@ -133,7 +131,7 @@ By giving users power to manage their own accounts, you reduce the need for admi ### Self registration Self-registration allows your customers to take control of their business accounts. -This not only improves customer satisfaction but also reduces the administrative burden on your team. +This not only improves customer satisfaction but also reduces the administrative burden on your team. With the ability to integrate with [[= product_name_connect =]], you're able to fully automate the process. ### Address book @@ -154,35 +152,32 @@ It allows you to make use of customer targeting of the segments and create perso ### General overview The overall benefit of customer portals is the help they provide to retain customers and increase loyalty, while freeing up customer service employees time for higher-level work. -They can achieve that by providing customers with up-to-date information about their orders and deliveries, personalize shopping experience, offer special deals available only to B2B partners and do that in one, easily accessible space. -Currently, customer portals are a standard in global sites such as Amazon. they're the level of quality that customers just expect, and all businesses strive for. +They can achieve that by providing customers with up-to-date information about their orders and deliveries, personalize shopping experience, offer special deals available only to B2B partners, and do that in one, accessible space. +Currently, Customer Portals are a standard in global sites such as Amazon. they're the level of quality that customers expect, and all businesses strive for. ### Simplified shopping process -Business account helps streamline the B2B shopping process with all the paperwork, payment, -and other administrative tasks converted into a few simple steps with prefilled forms, billing addresses, shipping addresses and more. +Business account helps streamline the B2B shopping process with all the paperwork, payment, and other administrative tasks converted into a few steps with prefilled forms, billing addresses, shipping addresses, and more. Making your site a go-to place for company orders. ### Better customer experience -In the era of internet, customers expect quick, accessible and excellent quality service and user experience from every business they associate with. +In the era of internet, customers expect quick, accessible and excellent quality service, and user experience from every business they associate with. Customer portals offer a seamless self-service experience by providing complete 24/7 access to relevant, up-to-date information and customer support. ### Client encouragement -Price strategies are a great way to build and maintain strong relationships with your trading partners. -With special prices available to B2B clients, you can offer the best deals in highly competitive markets. -Those discounts may be a great encouragement to convince big buyers to choose your business over other options. -Competitive prices impact not only the size of the customer base, -they affect every customer’s purchasing strategy, including the diversity, frequency, and volume of their orders. +Price strategies are a great way to build and maintain strong relationships with your trading partners. +With special prices available to B2B clients, you can offer the best deals in highly competitive markets. +Those discounts may be a great encouragement to convince big buyers to choose your business over other options. +Competitive prices impact not only the size of the customer base, they affect every customer’s purchasing strategy, including the diversity, frequency, and volume of their orders. ### Cost benefits -Customer portals help you to automate tasks that otherwise would be done by your employees manually, such as customer services, checking shipment status. -An additional benefit of customer portals is their availability 24/7. +Customer portals help you to automate tasks that otherwise would be done by your employees manually, such as customer services, checking shipment status. +An additional benefit of customer portals is their availability 24/7. Thus, reducing the need to allocate resources to extend working hours or hire more employees. ### Localization and personalization -The use of Page Builder in the Customer Portal creation process enables you to -create unique experiences for each business customer based on their location, business type, company, or market they operate on. \ No newline at end of file +The use of Page Builder in the Customer Portal creation process enables you to create unique experiences for each business customer based on their location, business type, company, or market they operate on. \ No newline at end of file From 18e811aa1e526f3b2fa231a4d3470423187643e9 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 14:19:13 +0200 Subject: [PATCH 34/77] Fixes in 'getting started' section --- docs/getting_started/first_steps.md | 65 +++++---- docs/getting_started/install_ibexa_dxp.md | 83 +++++------ .../install_on_mac_os_and_windows.md | 4 +- docs/getting_started/install_with_ddev.md | 36 ++--- docs/getting_started/requirements.md | 130 +++++++++++------- docs/getting_started/troubleshooting.md | 29 ++-- 6 files changed, 182 insertions(+), 165 deletions(-) diff --git a/docs/getting_started/first_steps.md b/docs/getting_started/first_steps.md index ce0c9f4939..6b7e930408 100644 --- a/docs/getting_started/first_steps.md +++ b/docs/getting_started/first_steps.md @@ -5,19 +5,17 @@ description: Start off working with Ibexa DXP by doing initial configuration and # First steps This page lists first steps you can take after installing [[= product_name =]]. -These are most common actions you may need to take in a new installation. +These steps are most common actions you may need to take in a new installation. !!! tip "Beginner tutorial" - To go through a full tutorial that leads from a clean installation to creating a full site, - see [Beginner tutorial](beginner_tutorial.md). + To go through a full tutorial that leads from a clean installation to creating a full site, see [Beginner tutorial](beginner_tutorial.md). ## Remove welcome page ![Welcome page](welcome_page.png) -To remove the welcome page and get a completely clean installation to start your project with, -remove the following files and folders from your installation: +To remove the welcome page and get a completely clean installation to start your project with, remove the following files and folders from your installation: - Delete the file `config/packages/ibexa_welcome_page.yaml` - Delete the `templates/themes/standard/full/welcome_page.html.twig` file @@ -45,9 +43,9 @@ module.exports = [ eZConfig, ibexaConfig, ...customConfigs ]; 2\. In the upper-right corner, click the avatar icon and in the drop-down menu disable the [Focus mode]([[= user_doc =]]/getting_started/discover_ui/#focus-mode). -3\. Select Content and go to content types. +3\. Select content and go to content types. -4\. Enter the Content group and create a new content type. +4\. Enter the content group and create a new content type. ![Creating a content type](first-steps-create-ct.png) @@ -63,12 +61,11 @@ For more information, see [Content model](content_model.md). ## Create Twig templates and match then with view config -To display Content in the front page you need to define content views and templates. +To display content in the front page you need to define content views and templates. Content views decide which templates and controllers are used to display content. -1\. In `config/packages/ibexa.yaml`, under `ibexa.system` -add the following block (pay attention to indentation: `site_group` should be one level below `system`): +1\. In `config/packages/ibexa.yaml`, under `ibexa.system` add the following block (pay attention to indentation: `site_group` should be one level below `system`): ``` yaml site_group: @@ -93,11 +90,12 @@ For more information, see [Templates](templates.md) and [Twig documentation](htt ## Create content and test view templates -1\. Go to the back office, activate Content/Content structure and create a new content item by clicking **Create content**. +1\. Go to the back office, activate content/content structure and create a new content item by clicking **Create content**. ![Creating a Blog Post](first-steps-create-content.png) -2\. Select a Blog Post content type. Fill in the content item and publish it. +2\. Select a Blog Post content type. +Fill in the content item and publish it. 3\. To preview the new content item on the front page, go to `/`. For example, if the title of the Blog post is "First blog post", the address is `/first-blog-post`. @@ -108,7 +106,8 @@ For example, if the title of the Blog post is "First blog post", the address is You can use SiteAccesses to serve different versions of the website. -SiteAccesses are used depending on matching rules. they're set up in YAML configuration under the `ibexa.siteaccess.list` key. +SiteAccesses are used depending on matching rules. +They're set up in YAML configuration under the `ibexa.siteaccess.list` key. 1\. In `config/packages/ibexa.yaml` add a new SiteAccess called `de` for the German version of the website: @@ -127,8 +126,7 @@ The SiteAccess is automatically matched using the last part of the URI. !!! note "Log in" - At this point you need to log in to preview the new SiteAccess, - because an anonymous visitor doesn't have permissions to view it. + At this point you need to log in to preview the new SiteAccess, because an anonymous visitor doesn't have permissions to view it. See [section about permissions below](#set-up-permissions). For now the new SiteAccess doesn't differ from the main site. @@ -139,8 +137,7 @@ For more information, see [Multisite](multisite.md) and [SiteAccess matchers](si One of the most common use cases for SiteAccesses is having different language versions of a site. -1\. To set up the `de` SiteAccess to use a different language, add its configuration under `ibexa.system`, -below `site.languages`: +1\. To set up the `de` SiteAccess to use a different language, add its configuration under `ibexa.system`, below `site.languages`: ``` yaml site: @@ -158,14 +155,16 @@ Make sure it's enabled. ![Creating a language](first-steps-create-language.png) -3\. Next, go to the Content structure and open the blog post you had created earlier. +3\. Next, go to the **Content structure** and open the blog post you had created earlier. Switch to the **Translations** tab and add a new translation. ![Adding a translation](first-steps-add-translation.png) -4\. Select German and base the new translation on the English version. Edit the content item and publish it. +4\. Select German and base the new translation on the English version. +Edit the content item and publish it. -5\. Go to the front page. The blog post now displays different content, depending on which SiteAccess you enter it from: +5\. Go to the front page. +The blog post now displays different content, depending on which SiteAccess you enter it from: `/` or `/de/`. ![Previewing translated Content](first-steps-translated-content.png) @@ -192,8 +191,8 @@ ibexa_design_engine: 3\. Under `site`, add `design: site_design` -4\. Go back to the `content_view` configuration for the blog post. Change the path to the template so that it points to the folder for the correct design: -`template: '@ibexadesign\full\blog_post.html.twig'` +4\. Go back to the `content_view` configuration for the blog post. +Change the path to the template so that it points to the folder for the correct design: `template: '@ibexadesign\full\blog_post.html.twig'` This means that the app looks for the `blog_post.html.twig` file in a folder relevant for the SiteAccess: `de_design` for the `de` SiteAccess, or `site_design` for other SiteAccesses in `site_group`. @@ -201,7 +200,8 @@ This means that the app looks for the `blog_post.html.twig` file in a folder rel 6\. Move the existing `full\blog_post.html.twig` file under `site_design`. -7\. Copy it also under `de_design`. Modify the second one in any way (for example, add some html), so you can preview the effect. +7\. Copy it also under `de_design`. +Modify the second one in any way (for example, add some html), so you can preview the effect. 8\. To see the difference between the different themes, compare what is displayed at `/` and `/de/` @@ -209,19 +209,24 @@ This means that the app looks for the `blog_post.html.twig` file in a folder rel To allow a group of users to edit only a specific content type (in this example, blog posts), you need to set up permissions for them. -Users and user groups are assigned roles. A role can contain a number of policies, which are rules that permit the user to perform a specific function. +Users and user groups are assigned roles. +A role can contain a number of policies, which are rules that permit the user to perform a specific function. Policies can be additionally restricted by limitations. -1\. Go to Admin > Users. Create a new user group (the same way you create regular Content). +1\. Go to **Admin** -> **Users**. +Create a new user group (the same way you create regular content). Call the group "Bloggers". -2\. In the new group create a User. Remember their username and password. Mark the user as "Enabled". +2\. In the new group create a user. +Remember their username and password. +Mark the user as "Enabled". ![Creating a User](first-steps-create-user.png) -3\. Go to **Admin** -> **Roles**. Create a new role called "Blogger". +3\. Go to **Admin** -> **Roles**. +Create a new role called "Blogger". -4\. Add policies that allow the User to log in: +4\. Add policies that allow the user to log in: - `User/Login` - `Content/Read` @@ -229,7 +234,7 @@ Call the group "Bloggers". - `Section/View` - `Content/Reverserelatedlist` -5\. Now add policies that allow the User to create and publish content, limited to Blog Posts: +5\. Now add policies that allow the user to create and publish content, limited to Blog Posts: - `Content/Create` with limitation for content type Blog Post - `Content/Edit` with limitation for content type Blog Post @@ -241,7 +246,7 @@ Call the group "Bloggers". ![Assigning a role](first-steps-assign-roles.png) -You can now log out and log in again as the new User. +You can now log out and log in again as the new user. You're able to create Blog Posts only. For more information, see [Permissions](permissions.md). diff --git a/docs/getting_started/install_ibexa_dxp.md b/docs/getting_started/install_ibexa_dxp.md index 04f286637c..0fa8686167 100644 --- a/docs/getting_started/install_ibexa_dxp.md +++ b/docs/getting_started/install_ibexa_dxp.md @@ -8,14 +8,12 @@ description: Install Ibexa DXP on a Linux system and prepare your installation f Installation for production is only supported on Linux. - To install [[= product_name =]] for development on macOS or Windows, - see the [installation guide for macOS and Windows](install_on_mac_os_and_windows.md). + To install [[= product_name =]] for development on macOS or Windows, see the [installation guide for macOS and Windows](install_on_mac_os_and_windows.md). !!! note "Installing [[= product_name_oss =]]" This installation guide shows in details how to install [[= product_name =]] for users who have a subscription agreement with [[= product_name_base =]]. - If you want to install [[= product_name_oss =]], you don't need authentication tokens or an account on updates.ibexa.co, - but must adapt the steps shown here to the product edition and the `ibexa/oss-skeleton` repository. + If you want to install [[= product_name_oss =]], you don't need authentication tokens or an account on updates.ibexa.co, but must adapt the steps shown here to the product edition and the `ibexa/oss-skeleton` repository. ## Prepare work environment @@ -25,12 +23,12 @@ You can install it by following your favorite tutorial, for example: [Install LA Additional requirements: -- [Node.js](https://nodejs.org/en) and [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable) for asset management. -- `git` for version control. +- [Node.js](https://nodejs.org/en) and [Yarn](https://classic.yarnpkg.com/en/docs/install/#debian-stable) for asset management +- `git` for version control [For production](#prepare-installation-for-production) you also need Apache or nginx as the HTTP server (Apache is used as an example below). -Before getting started, make sure you review other [requirements](requirements.md) to see the systems we support and use for testing. +Before getting started, make sure you review other [requirements](requirements.md) to see the systems that is supported and used for testing. ### Get Composer @@ -59,7 +57,7 @@ composer -V ### Set up authentication tokens [[= product_name =]] subscribers have access to commercial packages at [updates.ibexa.co](https://updates.ibexa.co/). -The site is password-protected. +The site is password-protected. You must set up authentication tokens to access the site. Log in to your service portal on [support.ibexa.co](https://support.ibexa.co/), go to your **Service Portal**, and look for the following on the **Maintenance and Support agreement details** screen: @@ -67,14 +65,14 @@ Log in to your service portal on [support.ibexa.co](https://support.ibexa.co/), ![Authentication token](using_composer_auth_token.png) 1. Select **Create token** (this requires the **Portal administrator** access level). -2. Fill in a label describing the use of the token. This allows you to revoke access later. +2. Fill in a label describing the use of the token. +This allows you to revoke access later. 3. Save the password, **you aren't able to access it again**. !!! tip "Save the authentication token in `auth.json` to avoid re-typing it" Composer asks whether you want to save the token every time you perform an update. - If you prefer, you can decline and create an `auth.json` file globally - in [`COMPOSER_HOME`](https://getcomposer.org/doc/03-cli.md#composer-home) directory for machine-wide use: + If you prefer, you can decline and create an `auth.json` file globally in [`COMPOSER_HOME`](https://getcomposer.org/doc/03-cli.md#composer-home) directory for machine-wide use: ``` bash composer config --global http-basic.updates.ibexa.co @@ -85,22 +83,23 @@ Log in to your service portal on [support.ibexa.co](https://support.ibexa.co/), ``` bash export COMPOSER_AUTH='{"http-basic":{"updates.ibexa.co": {"username": "", "password": ""}}}' ``` - + You then need to [add the contents of this variable to `auth.json`](#authentication-token). !!! tip "Different tokens for different projects on a single host" - If you configure several projects on one machine, make sure that - you set different tokens for each of the projects in their respective `auth.json` files. + If you configure several projects on one machine, make sure that you set different tokens for each of the projects in their respective `auth.json` files. -After this, when running Composer to get updates, you're asked for a username and password. Use: +After this, when running Composer to get updates, you're asked for a username and password. +Use: - as username - your Installation key found on the **Maintenance and Support agreement details** page in the service portal -- as password - the token password you retrieved in step 3 above. +- as password - the token password you retrieved in step 3 above !!! note "Authentication token validation delay" - You can encounter some delay between creating the token and being able to use it in Composer. It might take up to 15 minutes. + You can encounter some delay between creating the token and being able to use it in Composer. + It might take up to 15 minutes. !!! caution "Support agreement expiry" @@ -110,8 +109,7 @@ After this, when running Composer to get updates, you're asked for a username an ### Create project -To use Composer to instantly create a project in the current folder with all the dependencies, -run the following command: +To use Composer to instantly create a project in the current folder with all the dependencies, run the following command: !!! note "Using PHP 8.3 (recommended)" @@ -160,8 +158,7 @@ run the following command: !!! tip "Authentication token" - If you added credentials to the `COMPOSER_AUTH` variable, - at this point add this variable to `auth.json` (for example, by running `echo $COMPOSER_AUTH > auth.json`). + If you added credentials to the `COMPOSER_AUTH` variable, at this point add this variable to `auth.json` (for example, by running `echo $COMPOSER_AUTH > auth.json`). !!! tip @@ -174,13 +171,12 @@ run the following command: !!! note "Platform.sh" - If you're deploying your installation on [Platform.sh](https://docs.platform.sh/guides/ibexa/deploy.html), - run the following command: - + If you're deploying your installation on [Platform.sh](https://docs.platform.sh/guides/ibexa/deploy.html), run the following command: + ``` bash composer ibexa:setup --platformsh ``` - + This command provides the necessary configuration for using Platform.sh. #### Add project to version control @@ -194,8 +190,7 @@ git init; git add . > /dev/null; git commit -m "init" > /dev/null ### Change installation parameters -At this point configure your database via the `DATABASE_URL` in the `.env` file, -depending of the database you're using: +At this point configure your database via the `DATABASE_URL` in the `.env` file, depending of the database you're using: `DATABASE_URL=mysql://user:password@host:port/database_name`. @@ -211,26 +206,24 @@ or ### Add entropy to improve cryptographic randomness -Choose a [secret]([[= symfony_doc =]]/reference/configuration/framework.html#secret) -and provide it in the `APP_SECRET` parameter in `.env`. +Choose a [secret]([[= symfony_doc =]]/reference/configuration/framework.html#secret) and provide it in the `APP_SECRET` parameter in `.env`. It should be a random string, made up of at least 32 characters, numbers, and symbols. -This is used by Symfony when generating [CSRF tokens]([[= symfony_doc =]]/security/csrf.html), -[encrypting cookies]([[= symfony_doc =]]/cookbook/security/remember_me.html), -and for creating signed URIs when using [ESI (Edge Side Includes)]([[= symfony_doc =]]/http_cache/esi.html). +It's used by Symfony when generating [CSRF tokens]([[= symfony_doc =]]/security/csrf.html), [encrypting cookies]([[= symfony_doc =]]/cookbook/security/remember_me.html), and for creating signed URIs when using [ESI (Edge Side Includes)]([[= symfony_doc =]]/http_cache/esi.html). !!! caution - The app secret is crucial to the security of your installation. Be careful about how you generate it, and how you store it. + The app secret is crucial to the security of your installation. + Be careful about how you generate it, and how you store it. Here's one way to generate a 64 characters long, secure random string as your secret, from command line: - + ``` bash php -r "print bin2hex(random_bytes(32));" ``` Don't commit the secret to version control systems, or share it with anyone who doesn't strictly need it. If you have any suspicion that the secret may have been exposed, replace it with a new one. - The same goes for other secrets, like database password, Varnish invalidate token, JWT passphrase, etc. - + The same goes for other secrets, like database password, Varnish invalidate token, JWT passphrase, and more. + After changing the app secret, make sure that you clear the application cache and log out all the users. For more information, see [Symfony documentation]([[= symfony_doc =]]/reference/configuration/framework.html#secret). @@ -278,8 +271,7 @@ php bin/console ibexa:graphql:generate-schema Before executing the command make sure that the database user has sufficient permissions. -If Composer asks for your token, you must log in to your GitHub account and generate a new token -(edit your profile and go to **Developer settings** > **Personal access tokens** > **Generate new token** with default settings). +If Composer asks for your token, you must log in to your GitHub account and generate a new token (edit your profile and go to **Developer settings** > **Personal access tokens** > **Generate new token** with default settings). This operation is performed only once, when you install [[= product_name =]] for the first time. ### Run post-installation script @@ -344,15 +336,14 @@ Future files and directories created by these two users need to inherit those pe !!! caution - For security reasons, in production, the web server cannot have write access to other directories than `var`. + For security reasons, in production, the web server cannot have write access to other directories than `var`. Skip the step above and follow the link below for production needs instead. You must also make sure that the web server cannot interpret the files in the `var` directory through PHP. To do so, follow the instructions on [setting up a virtual host below](#set-up-virtual-host). To set up permissions for production, it's recommended to use an ACL (Access Control List). -See [Setting up or Fixing File Permissions]([[= symfony_doc =]]/setup/file_permissions.html) in Symfony documentation -for information on how to do it on different systems. +See [Setting up or Fixing File Permissions]([[= symfony_doc =]]/setup/file_permissions.html) in Symfony documentation for information on how to do it on different systems. ### Set up virtual host @@ -364,8 +355,7 @@ Prepare a [virtual host configuration](https://en.wikipedia.org/wiki/Virtual_hos to `/etc/apache2/sites-available` as a `.conf` file and modify it to fit your project. Specify `//public` as the `DocumentRoot` and `Directory`, or ensure `BASEDIR` is set in the environment. - Uncomment the line that starts with `#if [APP_ENV]` and set the value to `prod` or `dev`, depending on the environment that you're configuring, - or ensure `APP_ENV` is set in the environment. + Uncomment the line that starts with `#if [APP_ENV]` and set the value to `prod` or `dev`, depending on the environment that you're configuring, or ensure `APP_ENV` is set in the environment. ``` SetEnvIf Request_URI ".*" APP_ENV=prod @@ -388,9 +378,7 @@ Prepare a [virtual host configuration](https://en.wikipedia.org/wiki/Virtual_hos === "nginx" - You can use [this example vhost file](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/nginx/vhost.template) - and modify it to fit your project. You also need the `ibexa_params.d` files that should reside in a subdirectory below where the main file is, - [as is shown here](https://github.com/ibexa/post-install/tree/main/resources/templates/nginx). + You can use [this example vhost file](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/nginx/vhost.template) and modify it to fit your project. You also need the `ibexa_params.d` files that should reside in a subdirectory below where the main file is, [as is shown here](https://github.com/ibexa/post-install/tree/main/resources/templates/nginx). Specify `//public` as the `root`, or ensure `BASEDIR` is set in the environment. @@ -407,8 +395,7 @@ You should see the welcome page. !!! note "Security checklist" - See the [Security checklist](security_checklist.md) for a list of security-related issues - you should take care of before going live with a project. + See the [Security checklist](security_checklist.md) for a list of security-related issues you should take care of before going live with a project. ### Enable Date-based Publisher diff --git a/docs/getting_started/install_on_mac_os_and_windows.md b/docs/getting_started/install_on_mac_os_and_windows.md index 8a21f8b079..6349b8a423 100644 --- a/docs/getting_started/install_on_mac_os_and_windows.md +++ b/docs/getting_started/install_on_mac_os_and_windows.md @@ -11,7 +11,7 @@ This page explains how to install [[= product_name =]] on macOS or Windows. This procedure is **for development purposes only**. Installing [[= product_name =]] for production purposes is supported only on Linux. - For information about installing the product on Linux, see [Install [[= product_name =]]](install_ibexa_dxp.md). + For information about installing the product on Linux, see [Install [[= product_name =]]](install_ibexa_dxp.md). ### Prepare work environment @@ -39,7 +39,7 @@ The instructions below assume that you're using Apache. ``` bash zend_extension=opcache.so ``` - + You can install Apache as a Windows service by running the following command in CMD as administrator: ``` bash diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index e0bbad763a..dd3960c78b 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -52,12 +52,13 @@ To use MySQL instead, run the following command: ddev config --database=mysql:8.0 ``` -You can also use other versions of MariaDB, Mysql or PostgreSQL. +You can also use other versions of MariaDB, Mysql or PostgreSQL. See [DDEV database types documentation](https://ddev.readthedocs.io/en/latest/users/extend/database-types/) for available version ranges. #### Configure database connection -Now, configure the database connection for your [[= product_name =]] project. Depending on your database of choice (MySQL or PostgreSQL), use the appropriate command below. +Now, configure the database connection for your [[= product_name =]] project. +Depending on your database of choice (MySQL or PostgreSQL), use the appropriate command below. !!! note @@ -89,7 +90,8 @@ Now, configure the database connection for your [[= product_name =]] project. De #### Enable Mutagen (optional) -If you're using macOS or Windows, you might want to enable [Mutagen](https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen) to improve performance. You can do this by running the following command: +If you're using macOS or Windows, you might want to enable [Mutagen](https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen) to improve performance. +You can do this by running the following command: ```bash ddev config --performance-mode=mutagen @@ -122,13 +124,14 @@ ddev start Next, you need to [set up authentication tokens](install_ibexa_dxp.md#set-up-authentication-tokens) by modifying the Composer configuration. You must run the following command **after** executing `ddev start`, because the command runs inside the container. -Replace `` and `` with your actual installation key and token password, respectively. +Replace `` and `` with your actual installation key and token password. ```bash ddev composer config --global http-basic.updates.ibexa.co ``` -This authentication doesn't persist if the project is restarted (by `ddev restart` or `ddev composer create`). You can back up the authentication file (`auth.json`) by using the following command: +This authentication doesn't persist if the project is restarted (by `ddev restart` or `ddev composer create`). +You can back up the authentication file (`auth.json`) by using the following command: ```bash ddev exec "mkdir -p .ddev/homeadditions/.composer; cp ~/.composer/auth.json .ddev/homeadditions/.composer" @@ -138,8 +141,8 @@ If you want to reuse an existing `auth.json` file, see [Using `auth.json`](#usin ### 5. Create project -Once DDEV is running, use Composer to create a new [[= product_name =]] project. -Remember to replace `` and `` with your desired edition and version respectively. +Once DDEV is running, use Composer to create a new [[= product_name =]] project. +Remember to replace `` and `` with your desired edition and version. ```bash ddev composer create ibexa/-skeleton: @@ -185,10 +188,10 @@ DDEV offers several ways to get the same result, offering different levels of fl !!! tip Learn more about the [DDEV commands](https://ddev.readthedocs.io/en/latest/users/usage/commands/): - + - run [`ddev --help`](https://ddev.readthedocs.io/en/latest/users/usage/cli/#using-the-ddev-command) to list all commands - run [`ddev help `](https://ddev.readthedocs.io/en/latest/users/usage/commands/#help) to get usage details about a specific command - + Learn more about DDEV configuration from [`ddev config` command documentation](https://ddev.readthedocs.io/en/latest/users/usage/commands/#config) and [advanced configuration files documentation](https://ddev.readthedocs.io/en/latest/users/configuration/config/). @@ -196,11 +199,9 @@ DDEV offers several ways to get the same result, offering different levels of fl An `auth.json` file can be used for one project, or globally for all projects, with the [DDEV `homeaddition` feature](https://ddev.readthedocs.io/en/latest/users/extend/in-container-configuration/). -For example, you can copy an `auth.json` file to a DDEV project: -`cp /auth.json .ddev/homeadditions/.composer` +For example, you can copy an `auth.json` file to a DDEV project: `cp /auth.json .ddev/homeadditions/.composer` -Alternatively, the Composer global `auth.json` can be the DDEV global `auth.json` with the help of a symbolic link: -`mkdir -p ~/.ddev/homeadditions/.composer && ln -s ~/.composer/auth.json ~/.ddev/homeadditions/.composer/auth.json` +Alternatively, the Composer global `auth.json` can be the DDEV global `auth.json` with the help of a symbolic link: `mkdir -p ~/.ddev/homeadditions/.composer && ln -s ~/.composer/auth.json ~/.ddev/homeadditions/.composer/auth.json` If the DDEV project has already been started, you need to run `ddev restart`. @@ -284,7 +285,7 @@ ddev config --webserver-type=apache-fpm [[= product_name =]] can't run on Apache without a dedicated Virtual Host. -To set the Apache Virtual Host, override `.ddev/apache/apache-site.conf` with [[= product_name =]]'s config. +To set the Apache Virtual Host, override `.ddev/apache/apache-site.conf` with [[= product_name =]]'s config. You can do it manually or by using a script. #### Manual procedure @@ -414,14 +415,15 @@ If the local project needs to answer to real production domains (for example, to ### Cluster or [[= product_name_cloud =]] -DDEV can be useful to locally simulate a production cluster. +You can use DDEV to locally simulate a production cluster. -- See [clustering with DDEV](clustering_with_ddev.md) to add Elasticsearch, Solr, Redis or Memcached to your DDEV installation. +- See [clustering with DDEV](clustering_with_ddev.md) to add Elasticsearch, Solr, Redis, or Memcached to your DDEV installation. - See [DDEV and [[= product_name_cloud =]]](ddev_and_ibexa_cloud.md) to locally run an [[= product_name =]] project by using DDEV. ## Stop or remove the project -If you need to stop the project to start it again later, use `ddev stop`. Then, use `ddev start` to run the project in the same state. +If you need to stop the project to start it again later, use `ddev stop`. +Then, use `ddev start` to run the project in the same state. If you want to fully remove the project: diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index e443bdc378..f787218e46 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -20,9 +20,12 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, !!! caution "Recommended versions" - Review all the recommended versions carefully. If you see a "+" next to the product version, it means that we recommend this version or higher within the same major release. For example, "1.18+" means any 1.x version higher or equal to 1.18, but not 2.x. + Review all the recommended versions carefully. + If you see a "+" next to the product version, it means that we recommend this version or higher within the same major release. + For example, "1.18+" means any 1.x version higher or equal to 1.18, but not 2.x. - Using the latest listed version of each product or component is recommended. Always use a version that receives security updates, either by the vendor themselves or by a trusted third party, such as the distribution vendor. + Using the latest listed version of each product or component is recommended. + Always use a version that receives security updates, either by the vendor themselves or by a trusted third party, such as the distribution vendor. ## Operating system @@ -36,7 +39,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, |Ubuntu "Jammy Jellyfish"| 22.04 | |RHEL / CentOS | 8.1-8.5+ | - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "[[= product_name =]] v3.3" @@ -48,7 +52,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, |Ubuntu "Jammy Jellyfish"| 22.04 | |RHEL / CentOS | 8.1-8.5+ | - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "eZ Platform v2.5" @@ -58,7 +63,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, |Ubuntu "Bionic" | 18.04 LTS | |RHEL / CentOS | 8.0-8.5+ | - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. ## Web server @@ -68,7 +74,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; event MPM is recommended, if you need to use prefork you also need the `mod_php` module) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "[[= product_name =]] v3.3" @@ -90,7 +97,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - MySQL 8.0 - PostgreSQL 14 - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "[[= product_name =]] v3.3" @@ -98,15 +106,18 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - MySQL 8.0 (optionally 5.7 - deprecated) - PostgreSQL 10+ (PostgreSQL 10 has reached its End of Life. We highly recommend using PostgreSQL 14 for optimal performance and security) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "eZ Platform v2.5" - MariaDB 10.3, 10.4 (optionally 10.2 - deprecated) - MySQL 8.0 (optionally 5.7 - deprecated) - - PostgreSQL 10+ (PostgreSQL 10 has reached its End of Life. We highly recommend using PostgreSQL 14 for optimal performance and security) + - PostgreSQL 10+ (PostgreSQL 10 has reached its End of Life. + We highly recommend using PostgreSQL 14 for optimal performance and security) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. ## PHP @@ -129,10 +140,13 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "eZ Platform v2.5" - - 7.1 (PHP 7.1 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) + - 7.1 (PHP 7.1 has reached its End of Life. + Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) - 7.2 (PHP 7.2 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]]P v3.3 or v4.x) - - 7.3 (PHP 7.3 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) - - 7.4 (PHP 7.4 has reached its End of Life. Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) + - 7.3 (PHP 7.3 has reached its End of Life. + Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) + - 7.4 (PHP 7.4 has reached its End of Life. + Unless you have extended support from vendors like Debian or Zend, you should upgrade to [[= product_name =]] v3.3 or v4.x) ### PHP extensions @@ -195,26 +209,32 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - `php-redis` 3.1.3+ or `php-memcached` 3.x+* - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. ## Search === "[[= product_name =]] v4.6" - - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. + - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. + Alternatively, Elasticsearch 7.16.2 or higher 7.x version. + - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. + Newer versions aren't supported. === "[[= product_name =]] v3.3" - - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. + - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. + Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - For BinaryFile field indexing, Apache Tika 1.20 or higher 1.x version, recommended 1.28.1 or higher. - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. === "eZ Platform v2.5" - - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. + - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. + Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - For BinaryFile field indexing, Apache Tika 1.20 or higher 1.x version, recommended 1.28.1 or higher. - - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. + - The above solutions require Oracle Java/Open JDK. + The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. ## Graphic Handler @@ -262,7 +282,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Redis 4.0+, 5.0 or higher (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "[[= product_name =]] v3.3" @@ -270,7 +291,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Redis 4.0+, 5.0 or higher (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher - [Varnish](http://varnish-cache.org/) 6.0LTS with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](https://doc.ibexa.co/en/3.3/guide/cache/http_cache/#serving-varnish-through-fastly) (for HTTP Cache) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "eZ Platform v2.5" @@ -278,7 +300,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - Redis 3.2+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher - [Varnish](http://varnish-cache.org/) 5.1 or 6.0LTS with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](https://doc.ibexa.co/en/2.5/guide/cache/http_cache/#serving-varnish-through-fastly) (for HTTP Cache) - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. ## Filesystem @@ -315,27 +338,32 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, - `Node.js` 18+ - `yarn` 1.15.2+ - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "[[= product_name =]] v3.3" - - `Node.js` 14+, 16+, 18+ (`Node.js` 14+ has reached its End of Life. We strongly recommend using a newer version to ensure you receive security updates.) + - `Node.js` 14+, 16+, 18+ (`Node.js` 14+ has reached its End of Life. + We strongly recommend using a newer version to ensure you receive security updates.) - `yarn` 1.15.2+ - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. === "eZ Platform v2.5" - `Node.js` 10, 12 or 14 - `yarn` 1.15.2+ - If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. + If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. + For example, "1.18+" means any 1.x version equal to or higher than 1.18, but not 2.x. ## Browser === "[[= product_name =]] v4.6" - [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. + However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -344,7 +372,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "[[= product_name =]] v3.3" - [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + [[= product_name =]] is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. + However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -353,7 +382,8 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "eZ Platform v2.5" - eZ Platform is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. + eZ Platform is developed to work with *any* web browser that supports modern standards, on *any* screen resolution suitable for web, running on *any* device. + However for the Editorial and Administration User Interfaces you need: a minimum of 1366-by-768 screen resolution, a desktop or tablet device, and a recommended/supported browser among the ones found below. - Mozilla® Firefox® most recent stable version (recommended) - Google Chrome™ most recent stable version (recommended) @@ -370,18 +400,19 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. + As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). ### [[= product_name_cloud =]] Setup support matrix - All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. + All [[= product_name =]] features are supported in accordance with the example above. + For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. !!! note - As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, - for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. ### Recommended [[= product_name_cloud =]] setup @@ -406,8 +437,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, Features supported by [[= product_name =]], but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of [[= product_name =]]. - We recommend giving the development team working on the project access to the bucket - to ensure work is done in a DevOps way without depending on external teams when changes are needed. + We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. === "[[= product_name_cloud =]] v3.3" @@ -417,18 +447,19 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. + As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). ### [[= product_name_cloud =]] Setup support matrix - All [[= product_name =]] features are supported in accordance with the example above. For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. + All [[= product_name =]] features are supported in accordance with the example above. + For example: As Legacy Bridge isn't supported with v3, it's not supported on [[= product_name_cloud =]] either. !!! note - As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, - for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for [[= product_name_cloud =]] / Platform.sh it's impossible to have a DFS table in a separate database. ### Recommended [[= product_name_cloud =]] setup @@ -453,8 +484,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, Features supported by [[= product_name =]], but not natively by Platform.sh, can in many cases be used by means of custom integrations with external services. For example, you can create an integration with S3 by means of setting up your own S3 bucket and configuring the relevant parts of [[= product_name =]]. - We recommend giving the development team working on the project access to the bucket - to ensure work is done in a DevOps way without depending on external teams when changes are needed. + We recommend giving the development team working on the project access to the bucket to ensure work is done in a DevOps way without depending on external teams when changes are needed. === "eZ Platform Cloud v2.5" @@ -464,8 +494,10 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, For example: - - Platform.sh provides Redis support for versions 2.8, 3.0 and 3.2. eZ Platform supports Redis version 3.2 or higher. As a result, Redis is supported by eZ Platform Cloud versions 3.2. - - Platform.sh provides Elastic Search service (different versions supported). Elastic Search isn't supported for use as search engine for eZ Platform. + - Platform.sh provides Redis support for versions 2.8, 3.0 and 3.2. eZ Platform supports Redis version 3.2 or higher. + As a result, Redis is supported by eZ Platform Cloud versions 3.2. + - Platform.sh provides Elastic Search service (different versions supported). + Elastic Search isn't supported for use as search engine for eZ Platform. Features or services supported by eZ Platform but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations). @@ -489,22 +521,18 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, ### Experimental/custom Platform.sh setups Any use of experimental versions or setups isn't eligible for use with eZ Platform Cloud. - However, it's possible to use an eZ Enterprise subscription in combination with a Platform.sh contract, - where you or a partner take ownership of the configuration to set up the project. + However, it's possible to use an eZ Enterprise subscription in combination with a Platform.sh contract, where you or a partner take ownership of the configuration to set up the project. - Such projects are possible by means of custom integrations/configuration, - but they may generate issues that aren't covered by eZ Enterprise subscription bug fix guarantee. + Such projects are possible by means of custom integrations/configuration, but they may generate issues that aren't covered by eZ Enterprise subscription bug fix guarantee. !!! tip "Use a partner with prior experience on legacy and Platform.sh" - If you're in need of setting up your legacy project on Platform.sh for a transitional period, - eZ can put you in contact with a partner experienced in setting up older projects on Platform.sh. + If you're in need of setting up your legacy project on Platform.sh for a transitional period, eZ can put you in contact with a partner experienced in setting up older projects on Platform.sh. This saves you a lot of time and effort. !!! note - As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, - for eZ Platform Cloud / Platform.sh it's impossible to have a DFS table in a separate database. + As Platform.sh doesn't support a configuration with multiple PostgreSQL databases, for eZ Platform Cloud / Platform.sh it's impossible to have a DFS table in a separate database. ### Custom integrations diff --git a/docs/getting_started/troubleshooting.md b/docs/getting_started/troubleshooting.md index baf4d54405..effafa9390 100644 --- a/docs/getting_started/troubleshooting.md +++ b/docs/getting_started/troubleshooting.md @@ -8,12 +8,12 @@ This page lists potential problems that you may encounter while installing, conf ## Encoding database password -The password entered in `DATABASE_URL` during installation must either be URL encoded, -or not contain any special characters that would require URL encoding. +The password entered in `DATABASE_URL` during installation must either be URL encoded, or not contain any special characters that would require URL encoding. ### URL encoding -Using URL encoding involves two steps. First, the password must be URL encoded. This can for instance be done with PHP's `urlencode()` function. +Using URL encoding involves two steps. +First, the password must be URL encoded. This can for instance be done with PHP's `urlencode()` function. For example, this function converts a password like `(/!=#Ƥ*;%?[` to `%28%2F%21%3D%23%C3%86%C2%A4%2A%3B%25%3F%5B`. Second, you must remove `resolve:` from `doctrine.dbal.url` in `config/packages/doctrine.yaml`. @@ -22,10 +22,10 @@ That means changing `%env(resolve:DATABASE_URL)%` to `%env(DATABASE_URL)%`. ### Avoid special characters If your password only contains letters a-z, A-Z, and numbers 0-9, you don't need to do any encoding. -You can either create your password that way, in which case it's a good idea to make it longer to maintain entropy, -keeping the password hard to guess for an attacker. +You can either create your password that way, in which case it's a good idea to make it longer to maintain entropy, keeping the password hard to guess for an attacker. Or, you can for instance convert your password with `bin2hex()`, so that, for example, `(/!=#Ƥ*;%?[` becomes `282f213d23c386c2a42a3b253f5b`. -The output from `bin2hex` is limited to 0-9 and a-f. This more than doubles the length of the password, keeping entropy similar. +The output from `bin2hex` is limited to 0-9 and a-f. +This more than doubles the length of the password, keeping entropy similar. ## Enabling swap with limited RAM @@ -38,9 +38,9 @@ When a system runs out of RAM, you may see `Killed` when trying to clear the cac ## Upload size limit -To make use of the back office, the defined maximum upload size must be consistent with the maximum file size defined in the content type using a File, Media or Image field. +To make use of the back office, the defined maximum upload size must be consistent with the maximum file size defined in the content type using a File, Media, or Image field. -This is done by setting `LimitRequestBody` for Apache or `client_max_body_size` for nginx. +It's done by setting `LimitRequestBody` for Apache or `client_max_body_size` for nginx. For instance, if one of those fields is configured to accept files up to 10MB, then `client_max_body_size` (in case of nginx) should be set above 10MB, with a safe margin, for example to 15MB. @@ -58,16 +58,13 @@ To avoid the error, check the stability of packages and avoid using `--prefer-s ### Inconsistent cache/session data -If cache or session data inconsistent across web servers in Redis, -see [Redis clustering](persistence_cache.md#redis-clustering), and make sure you only read/write to -one active master instance at a time. +If cache or session data inconsistent across web servers in Redis, see [Redis clustering](persistence_cache.md#redis-clustering), and make sure you only read/write to one active master instance at a time. ### Removed or refused sessions If Redis sessions are removed or new sessions are refused. -see info on [Cluster setup](sessions.md#cluster-setup). -Ideally, use a separated instance of Redis for sessions, -that either never runs out of memory or uses an eviction policy that suits your needs. +For more information, see [Cluster setup](sessions.md#cluster-setup). +It's recommended to use a separated instance of Redis for sessions, that either never runs out of memory or uses an eviction policy that suits your needs. ## Conflict with roave/security-advisories @@ -90,9 +87,7 @@ In such case, require it again when the bug is fixed and the package is updated: ## Platform.sh HTTP access credentials with Varnish -If you're using Platform.sh with Varnish for HTTP cache -and you have [HTTP access control by login/password](https://docs.platform.sh/administration/web/configure-environment.html#http-access-control) enabled, -configure the following variables in your Platform.sh environment: +If you're using Platform.sh with Varnish for HTTP cache and you have [HTTP access control by login/password](https://docs.platform.sh/administration/web/configure-environment.html#http-access-control) enabled, configure the following variables in your Platform.sh environment: - `HTTPCACHE_USERNAME` - `HTTPCACHE_PASSWORD` From ae3a32afa273e1e23f49e95e10b3737b1936bec5 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 14:23:46 +0200 Subject: [PATCH 35/77] Fixes in 'ibexa cloud' --- docs/ibexa_cloud/ddev_and_ibexa_cloud.md | 25 +++++++++++++++------- docs/ibexa_cloud/ibexa_cloud_guide.md | 14 +++++++----- docs/ibexa_cloud/install_on_ibexa_cloud.md | 15 +++++-------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md index 03be4210d6..c8ab6ffa2e 100644 --- a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md +++ b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md @@ -17,22 +17,29 @@ Two ways are available to run an [[= product_name_cloud =]] project locally with To configure the [`ddev/ddev-platformsh` add-on](https://github.com/ddev/ddev-platformsh), you need a [Platform.sh API Token](https://docs.platform.sh/administration/cli/api-tokens.html). -The `ddev/ddev-platformsh` add-on configures the document root, the PHP version, the database, and the cache pool according to the [[= product_name_cloud =]] configuration. About the search engine, the add-on can configure Elasticsearch but can't configure Solr. If you use Solr on [[= product_name_cloud =]] and want to add it to your DDEV stack, see [clustering with DDEV and `ibexa/ddev-solr` add-on](clustering_with_ddev.md#solr). +The `ddev/ddev-platformsh` add-on configures the document root, the PHP version, the database, and the cache pool according to the [[= product_name_cloud =]] configuration. +About the search engine, the add-on can configure Elasticsearch but can't configure Solr. +If you use Solr on [[= product_name_cloud =]] and want to add it to your DDEV stack, see [clustering with DDEV and `ibexa/ddev-solr` add-on](clustering_with_ddev.md#solr). `COMPOSER_AUTH` from Platform.sh can't be used, because JSON commas are incorrectly interpreted by `--web-environment-add`, which sees them as multiple variable separators. -But the variable must exist for Platform.sh `hooks` scripts to work. To use an `auth.json` file for this purpose, see [Using `auth.json`](install_with_ddev.md#using-authjson). +But the variable must exist for Platform.sh `hooks` scripts to work. +To use an `auth.json` file for this purpose, see [Using `auth.json`](install_with_ddev.md#using-authjson). You must remove Node.js and NVM installations as they're already included in DDEV. The following sequence of commands: -1. Downloads the [[= product_name_cloud =]] Platform.sh project from the default environment "production" into a new directory using [Platform.sh CLI alias `ibexa_cloud` defined in introduction](#ibexa-cloud-and-ddev). (Replace `` with the hash of your own project. See [`ibexa_cloud help get`](https://docs.platform.sh/administration/cli.html#3-use) for options like selecting another environment). +1. Downloads the [[= product_name_cloud =]] Platform.sh project from the default environment "production" into a new directory using [Platform.sh CLI alias `ibexa_cloud` defined in introduction](#ibexa-cloud-and-ddev). +(Replace `` with the hash of your own project. +See [`ibexa_cloud help get`](https://docs.platform.sh/administration/cli.html#3-use) for options like selecting another environment). 1. Configures a new DDEV project. -1. Ignores `.ddev/` directory from Git. (Some DDEV config could be committed like in [this documentation](https://ddev.readthedocs.io/en/latest/users/extend/customization-extendibility/#extending-configyaml-with-custom-configyaml-files).) +1. Ignores `.ddev/` directory from Git. +(Some DDEV config could be committed like in [this documentation](https://ddev.readthedocs.io/en/latest/users/extend/customization-extendibility/#extending-configyaml-with-custom-configyaml-files).) 1. Sets Composer authentication by using an already existing `auth.json` file. 1. Creates a `public/var` directory if it doesn't exist, to allow the creation of `public/var/.platform.installed` by Platform.sh hook script. 1. Installs the `ddev/ddev-platformsh` add-on which prompts for the Platform.sh API token, project ID and environment name. -1. Comments out the Node.js and NVM installations from the hooks copied in `.ddev/config.platformsh.yaml`. (In this file, you may have to discard other specific features like New Relic.) +1. Comments out the Node.js and NVM installations from the hooks copied in `.ddev/config.platformsh.yaml`. +(In this file, you may have to discard other specific features like New Relic.) 1. Changes `maxmemory-policy` from default `allkeys-lfu` to a [value accepted by the `RedisTagAwareAdapter`](https://github.com/symfony/cache/blob/5.4/Adapter/RedisTagAwareAdapter.php#L95). 1. Starts the project. 1. Gets the content from Platform.sh, both database and binary files by using `ddev pull platform` feature from the add-on. @@ -66,9 +73,11 @@ The following example adapts the [manual method to run an already existing proje The following sequence of commands: -1. Downloads the [[= product_name_cloud =]] Platform.sh project from the default environment "production" into a new directory using [Platform.sh CLI alias `ibexa_cloud` defined in introduction](#ibexa-cloud-and-ddev). (Replace `` with the hash of your own project. See [`ibexa_cloud help get`](https://docs.platform.sh/administration/cli.html#3-use) for options like selecting another environment). +1. Downloads the [[= product_name_cloud =]] Platform.sh project from the default environment "production" into a new directory using [Platform.sh CLI alias `ibexa_cloud` defined in introduction](#ibexa-cloud-and-ddev). +(Replace `` with the hash of your own project. See [`ibexa_cloud help get`](https://docs.platform.sh/administration/cli.html#3-use) for options like selecting another environment). 1. Configures a new DDEV project. -1. Ignores `.ddev/` directory from Git. (Some DDEV config could be committed like in [this documentation](https://ddev.readthedocs.io/en/latest/users/extend/customization-extendibility/#extending-configyaml-with-custom-configyaml-files).) +1. Ignores `.ddev/` directory from Git. +(Some DDEV config could be committed like in [this documentation](https://ddev.readthedocs.io/en/latest/users/extend/customization-extendibility/#extending-configyaml-with-custom-configyaml-files).) 1. Starts the DDEV project. 1. Sets Composer authentication. 1. [Gets the database content from Platform.sh](https://docs.platform.sh/add-services/mysql.html#exporting-data). @@ -94,4 +103,4 @@ ddev launch From there, services can be added to get closer to [[= product_name_cloud =]] Platform.sh architecture. `.platform/services.yaml` indicates the services used. -Refer to [clustering with DDEV](clustering_with_ddev.md) for those additions. +For more information, see [clustering with DDEV](clustering_with_ddev.md). diff --git a/docs/ibexa_cloud/ibexa_cloud_guide.md b/docs/ibexa_cloud/ibexa_cloud_guide.md index 709d40eb1f..67876c3ced 100644 --- a/docs/ibexa_cloud/ibexa_cloud_guide.md +++ b/docs/ibexa_cloud/ibexa_cloud_guide.md @@ -41,16 +41,18 @@ When you have an account, you can log in to https://console.ibexa.cloud. ### Platform as a Service -[[= product_name_cloud =]] is a PaaS provider. It's a cloud-based subscription service that you can use for developing, managing, and running applications without infrastructure concerns. +[[= product_name_cloud =]] is a PaaS provider. +It's a cloud-based subscription service that you can use for developing, managing, and running applications without infrastructure concerns. This cloud computing approach gives users access to a full cloud platform, including hardware, software, and infrastructure. -PaaS eliminates the requirement to buy and install the necessary hardware and software. All you have to do is access it and you can start deploying resources and developing right away. +PaaS eliminates the requirement to buy and install the necessary hardware and software. +All you have to do is access it and you can start deploying resources and developing right away. ![How PaaS works](how_paas_works.png) ### Performance management Make your applications more effective, scalable, and effective by using the [Observability Suite](https://platform.sh/features/observability-suite/). -This package gives you the the ability to test, profile, and monitor your application before putting it into production. +This package gives you the ability to test, profile, and monitor your application before putting it into production. Observability Suite comes with each [[= product_name_cloud =]] subscription. ### Automation @@ -74,7 +76,8 @@ What's more, [[= product_name_cloud =]] as an end-to-end cloud hosting platform, Comprehensive data security procedures guarantee that you maintain complete ownership of your client's data, defining where it's stored. You can be sure that the safety protocols are compliant with all applicable legislation. -What's more, all updates to your code and infrastructure are fully auditable. Global CDN (Content Delivery Network) is included and fully managed. +What's more, all updates to your code and infrastructure are fully auditable. +Global CDN (Content Delivery Network) is included and fully managed. [[= product_name_cloud =]], thanks to extensive [[= product_name_base =]] support, enables effortless deployment. You can create a clone not only of the code, but also data and the infrastructure. As the infrastructure is exactly the same as what's currently in production, you can be sure that everything works well when you conduct your release and push it live. @@ -82,7 +85,8 @@ As the infrastructure is exactly the same as what's currently in production, you ### High availability and compatibility [[= product_name_cloud =]] is compatible with your choice of public cloud server and supports a variety of hosting platforms. -It's a Git-native development - compatible with Git Flow. [[= product_name_cloud =]] deployment integrates naturally at the end of your existing production chain, including staging, and work in progress branch preview. +It's a Git-native development - compatible with Git Flow. +[[= product_name_cloud =]] deployment integrates naturally at the end of your existing production chain, including staging, and work in progress branch preview. You can also integrate with, for example, Bitbucket, GitHub, Gitlab. You can instantly clone every branch of both your code and infrastructure configuration. Platform.sh (and [[= product_name_cloud =]], by extension) uses the [Infrastracture as Code approach](https://docs.platform.sh/learn/overview.html#infrastructure-as-code). diff --git a/docs/ibexa_cloud/install_on_ibexa_cloud.md b/docs/ibexa_cloud/install_on_ibexa_cloud.md index fc842e7bbb..21fa0b9bfc 100644 --- a/docs/ibexa_cloud/install_on_ibexa_cloud.md +++ b/docs/ibexa_cloud/install_on_ibexa_cloud.md @@ -22,15 +22,13 @@ You can adapt the configuration in the following places: - `.platform/services.yml` - additional services such as search engines or cache - `.platform/routes.yml` - routes to additional services, for example Fastly -For details about available configuration settings, -refer to [Platform.sh documentation](https://docs.platform.sh/create-apps.html). +For details about available configuration settings, refer to [Platform.sh documentation](https://docs.platform.sh/create-apps.html). ### Disk space The total disk space depends on your [[= product_name_cloud =]] subscription level. You can assign disk space to the main app container under the `disk` key. -You can distribute the remaining space between other containers (for example, the database) or search engine -in `.platform/services.yaml`, under the individual service definitions. +You can distribute the remaining space between other containers (for example, the database) or search engine in `.platform/services.yaml`, under the individual service definitions. ### Build and deploy process @@ -44,14 +42,11 @@ Configuration under `hooks` defines the process of building and deploying your p ### Additional services -`.platform/services.yaml` contains preconfigured setting blocks that you can uncomment -to enable services such as Solr or Elasticsearch, or persistent Redis session storage. +`.platform/services.yaml` contains preconfigured setting blocks that you can uncomment to enable services such as Solr or Elasticsearch, or persistent Redis session storage. -For information about available services, -see [Platform.sh documentation](https://docs.platform.sh/add-services.html#available-services). +For information about available services, see [Platform.sh documentation](https://docs.platform.sh/add-services.html#available-services). -If you enable any of the services, you must uncomment the relevant relationship -under the `relationship` key in `.platform.app.yaml` as well. +If you enable any of the services, you must uncomment the relevant relationship under the `relationship` key in `.platform.app.yaml` as well. ## 2. Create an account From 8dbc2cb3b3285f64ef4781c126e9fb2ba464c3e1 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 14:26:03 +0200 Subject: [PATCH 36/77] Fixes in 'ibexa engage' section --- docs/ibexa_engage/create_campaign.md | 17 +++++++++++------ docs/ibexa_engage/ibexa_engage.md | 3 ++- docs/ibexa_engage/install_ibexa_engage.md | 3 ++- docs/ibexa_engage/integrate_ibexa_connect.md | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/ibexa_engage/create_campaign.md b/docs/ibexa_engage/create_campaign.md index afff227235..5cf16b067c 100644 --- a/docs/ibexa_engage/create_campaign.md +++ b/docs/ibexa_engage/create_campaign.md @@ -6,7 +6,7 @@ edition: experience # Create campaign [Campaign]([[= user_doc =]]/ibexa_engage/ibexa_engage/#campaign) is a set of concepts, divided into steps, that the user can configure. -It can contain a welcome screen, an interaction element, a form step, an exit screen, and so on. +It can contain, for example, a welcome screen, an interaction element, a form step, and an exit screen. To create new campaign, you need to use Qualifio Manager. You can use Qualifio's existing templates and interactive elements, such as quizzes, pools, and forms, to create visually appealing, customized campaigns. Users can configure the backgrounds, themes, or designs, and set up a specific time frame for each campaign. @@ -24,11 +24,14 @@ For more information about publication channels, see [Publication channel]([[= u You can add [Campaign block]([[= user_doc =]]/content_management/block_reference/#campaign-block) in Page Builder to display campaign on the landing page. -To select campaign, go to **Properties** tab. From the **Campaign** drop-down, choose campaign. +To select campaign, go to **Properties** tab. +From the **Campaign** drop-down, choose campaign. This list includes all campaigns available on user's Qualifio account which are active or scheduled to launch in the future. -You can set the dimensions of the field in which the campaign is displayed. To do it, insert width and height values in the proper fields. -If size fields are blank, the system sets default template values. It's recommended to adjust them for better results. +You can set the dimensions of the field in which the campaign is displayed. +To do it, insert width and height values in the proper fields. +If size fields are blank, the system sets default template values. +It's recommended to adjust them for better results. ![Campaign block](campaign_block.png "Campaign block") @@ -38,7 +41,9 @@ You can embed campaign in the Rich text field with Campaign custom tag. To do it, insert **Campaign** content item in the Rich Text Field and choose campaign from the drop-down list. This list includes all campaigns available on user's Qualifio account which are active or scheduled to launch in the future. -You can set the dimensions of the field in which the campaign is displayed. To do it, select units, and provide width and height values in the proper fields. -If size fields are blank, the system sets default template values. It's recommended to adjust them for better results. +You can set the dimensions of the field in which the campaign is displayed. +To do it, select units, and provide width and height values in the proper fields. +If size fields are blank, the system sets default template values. +It's recommended to adjust them for better results. ![Campaign custom tag](campaign_custom_tag.png "Campaign custom tag") \ No newline at end of file diff --git a/docs/ibexa_engage/ibexa_engage.md b/docs/ibexa_engage/ibexa_engage.md index a48086f36e..89831e20f4 100644 --- a/docs/ibexa_engage/ibexa_engage.md +++ b/docs/ibexa_engage/ibexa_engage.md @@ -7,7 +7,8 @@ month_change: false # [[= product_name_engage =]] [[= product_name_engage =]] is a data collection tool. -It gives you the ability to use the [Qualifio](https://qualifio.com/) tools to engage your audiences. You can use interactive content to build relationships and collect important data, for example, a list of recent orders, or personal information about customers. +It gives you the ability to use the [Qualifio](https://qualifio.com/) tools to engage your audiences. +You can use interactive content to build relationships and collect important data, for example, a list of recent orders, or personal information about customers. You can also integrate [[= product_name_engage =]] with [[= product_name_connect =]] to create workflows. [[= cards([ diff --git a/docs/ibexa_engage/install_ibexa_engage.md b/docs/ibexa_engage/install_ibexa_engage.md index 3a6dd28cd1..d7143215d5 100644 --- a/docs/ibexa_engage/install_ibexa_engage.md +++ b/docs/ibexa_engage/install_ibexa_engage.md @@ -13,7 +13,8 @@ For more information, see [Qualifio Developers documentation](https://developers ## Enable [[= product_name_engage =]] account To use [[= product_name_engage =]], you must make arrangements with [[= product_name =]] to define the initial configuration. -[[= product_name_base =]] team creates and provides user account. An invitation link is sent during the setup process. +[[= product_name_base =]] team creates and provides user account. +An invitation link is sent during the setup process. For more information, see [[[= product_name_engage =]] in User Documentation]([[= user_doc =]]/ibexa_engage/ibexa_engage/#request-access). diff --git a/docs/ibexa_engage/integrate_ibexa_connect.md b/docs/ibexa_engage/integrate_ibexa_connect.md index c232161571..b0a8e9d49e 100644 --- a/docs/ibexa_engage/integrate_ibexa_connect.md +++ b/docs/ibexa_engage/integrate_ibexa_connect.md @@ -54,4 +54,5 @@ To do it, perform the following actions:: ![Configure Ibexa Engage](configure_ibexa_engage.png "Configure Ibexa Engage") -4\. Then, go to **Engage** -> **Integrations** -> **Push rules** to define the default or specific rules for new campaign or website. Select the created webhook. \ No newline at end of file +4\. Then, go to **Engage** -> **Integrations** -> **Push rules** to define the default or specific rules for new campaign or website. +Select the created webhook. \ No newline at end of file From 8c5b5ecd284f4b478edc5f7d0584219f8ea8fcd6 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 14:30:58 +0200 Subject: [PATCH 37/77] Fixes in 'ibexa products' section --- docs/ibexa_products/ibexa_commerce.md | 8 ++++---- docs/ibexa_products/ibexa_experience.md | 2 +- docs/ibexa_products/ibexa_headless.md | 25 +++++++------------------ 3 files changed, 12 insertions(+), 23 deletions(-) diff --git a/docs/ibexa_products/ibexa_commerce.md b/docs/ibexa_products/ibexa_commerce.md index 9970b8efec..7479a4776f 100644 --- a/docs/ibexa_products/ibexa_commerce.md +++ b/docs/ibexa_products/ibexa_commerce.md @@ -104,7 +104,7 @@ Recommendations can be used to propose related, alternative, or complimentary pr #### Use effective merchandising -Merchandising assists in keeping the consistency of the brand and providing customized product recommendations with captivating visuals and powerful search features. +Merchandising assists in keeping the consistency of the brand and providing customized product recommendations with captivating visuals and powerful search features. You can engage your customers with eye-catching graphics and information. The search engine makes it easy to find what they're looking for by providing quick and easy access to the product catalogs. @@ -124,7 +124,7 @@ You can create online store that really fits your needs. #### Automate business processes -With [[= product_name_com =]], the automation process becomes easier, which is essential if your company wants to do more with less effort. -It comes with all capabilities, including order and inventory management, customer data and custom pricing, which are needed to achieve it. -You can integrate with over 1,300 standard apps, including your CRM, ERP, PIM and DAM systems, and build custom connectors. +With [[= product_name_com =]], the automation process becomes easier, which is essential if your company wants to do more with less effort. +It comes with all capabilities, including order and inventory management, customer data, and custom pricing, which are needed to achieve it. +You can integrate with over 1,300 standard apps, including your CRM, ERP, PIM, and DAM systems, and build custom connectors. Also, you can use the ready-to-use pre-designed templates. \ No newline at end of file diff --git a/docs/ibexa_products/ibexa_experience.md b/docs/ibexa_products/ibexa_experience.md index d87d502eb4..856293bd28 100644 --- a/docs/ibexa_products/ibexa_experience.md +++ b/docs/ibexa_products/ibexa_experience.md @@ -126,7 +126,7 @@ To promote your campaign, you can add a Campaign block to a page in Page Builder ### Use cases With [[= product_name_exp =]], your customers are the main focus of all that you do. -It makes it simpler than ever to create the different touchpoints that your customers have with your brand, giving you the ability to guide them through your significant business procedures. +It makes it simpler than ever to create the different touchpoints that your customers have with your brand, giving you the ability to guide them through your significant business procedures. #### Build new pages and integrated forms diff --git a/docs/ibexa_products/ibexa_headless.md b/docs/ibexa_products/ibexa_headless.md index 5878661789..e4e29b433c 100644 --- a/docs/ibexa_products/ibexa_headless.md +++ b/docs/ibexa_products/ibexa_headless.md @@ -36,8 +36,7 @@ Then, content is available to end users through REST, GraphQL, or every output y ### 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. +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. @@ -54,8 +53,7 @@ APIs summary: - The OAuth 2 [Client](oauth_client.md) and [Server](oauth_server.md) 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. + 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 @@ -63,8 +61,7 @@ APIs summary: It comes without a default front office. You don't lose time to develop a theme for a provided front office before discovering it doesn'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. +[[= 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 @@ -173,22 +170,14 @@ Several features help end users collaborate on the content, such as: ## 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. +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 =]]. +If you prefer the human warmth of a retail store, if your products' numerous complex options should be discussed, +or if you're 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 From abe6688a7515c75428abea912c4b7c52ef6ed310 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:00:23 +0200 Subject: [PATCH 38/77] Fixes in 'cache' section --- .../cache/http_cache/content_aware_cache.md | 135 +++++++++--------- .../cache/http_cache/context_aware_cache.md | 45 ++---- .../cache/http_cache/fastly.md | 34 +++-- .../cache/http_cache/http_cache.md | 7 +- .../http_cache/http_cache_configuration.md | 21 ++- .../cache/http_cache/reverse_proxy.md | 65 ++++----- .../cache/persistence_cache.md | 44 +++--- 7 files changed, 154 insertions(+), 197 deletions(-) diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index 28813143ec..9dbcead81d 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -9,8 +9,7 @@ This awareness is accomplished by means of cache tagging. All supported reverse !!! note "Tag header is stripped in production for security reasons" - For security reasons this header, and other internal cache headers, - are stripped from output in production by the reverse proxy (in VCL for Varnish and Fastly). + For security reasons this header, and other internal cache headers, are stripped from output in production by the reverse proxy (in VCL for Varnish and Fastly). ## Cache tags @@ -20,9 +19,7 @@ Tags form a secondary set of keys assigned to every cache item, on top of the "p Like an index in a database, a tag is typically used for anything relevant that represents the given cache item. Tags are used for cache invalidation. -For example, the system tags every article response, and when the article content type is updated, -it tells Varnish that all articles should be considered stale -and updated in the background when someone requests them. +For example, the system tags every article response, and when the article content type is updated, it tells Varnish that all articles should be considered stale and updated in the background when someone requests them. Current content tags (and when the system purges on them): @@ -37,16 +34,14 @@ Current content tags (and when the system purges on them): !!! note "Automatic repository prefixing of cache tags" - As [[= product_name =]] supports multi-repository (multi-database) setups that can have overlapping IDs, - the shared HTTP cache systems need to distinguish tags relevant to the different content repositories. + As [[= product_name =]] supports multi-repository (multi-database) setups that can have overlapping IDs, the shared HTTP cache systems need to distinguish tags relevant to the different content repositories. This is why in multi-repository setup you can see cache tags such as `1p2`. In this example `1` represents the index among configured repositories, meaning the second repository in the system. Tags aren't prefixed for default repository (index "0"). -The content tags are returned in a header in the responses from [[= product_name =]]. The header name is dependent on -which HTTP Cache [[= product_name =]] is configured with: +The content tags are returned in a header in the responses from [[= product_name =]]. The header name is dependent on which HTTP Cache [[= product_name =]] is configured with: - Symfony reverse proxy: `X-Cache-Tags` - Varnish: `xkey` @@ -132,14 +127,15 @@ If the given content has several Locations, you can see several `l` ### ResponseConfigurator -A `ReponseCacheConfigurator` configures an HTTP Response object, makes the response public, adds tags, and sets the shared max age. +A `ReponseCacheConfigurator` configures an HTTP Response object, makes the response public, adds tags, and sets the shared max age. It's provided to `ReponseTaggers` that use it to add the tags to the response. The `ConfigurableResponseCacheConfigurator` (`Ibexa\HttpCache\ResponseConfigurator\ConfigurableResponseCacheConfigurator`) follows the `view_cache` configuration and only enables cache if it's enabled in the configuration. ### Delegator and Value taggers -- Delegator taggers - extract another value or several from the given value and pass it on to another tagger. For example, a `ContentView` is covered both by the `ContentValueViewTagger` and `LocationValueViewTagger`, where the first extracts the Content from the `ContentView` and passes it to the `ContentInfoTagger`. +- Delegator taggers - extract another value or several from the given value and pass it on to another tagger. +For example, a `ContentView` is covered both by the `ContentValueViewTagger` and `LocationValueViewTagger`, where the first extracts the content from the `ContentView` and passes it to the `ContentInfoTagger`. - Value taggers - extract the `Location` and pass it on to the `LocationViewTagger`. ## DispatcherTagger @@ -187,8 +183,7 @@ $tagHandler->addRelationTags([33, 44]); In PHP, FOSHttpCache exposes the `fos_http_cache.http.symfony_response_tagger` service which enables you to add tags to a response. -The following example adds minimal tags when ID 33 and 34 are rendered in ESI, -but parent response needs these tags to get refreshed if they're deleted: +The following example adds minimal tags when ID 33 and 34 are rendered in ESI, but parent response needs these tags to get refreshed if they're deleted: ``` php /** @var \FOS\HttpCacheBundle\Http\SymfonyResponseTagger $responseTagger */ @@ -199,8 +194,8 @@ See [Tagging from code](https://foshttpcachebundle.readthedocs.io/en/latest/feat 4\. Use deprecated `X-Location-Id` header. -For custom or built-in controllers (for example, REST) still using `X-Location-Id`, `XLocationIdResponseSubscriber` handles translating -this header to tags. It supports singular and comma-separated Location ID value(s): +For custom or built-in controllers (for example, REST) still using `X-Location-Id`, `XLocationIdResponseSubscriber` handles translating this header to tags. +It supports singular and comma-separated Location ID value(s): ```php /** @var \Symfony\Component\HttpFoundation\Response $response */ @@ -213,8 +208,7 @@ $response->headers->set('X-Location-Id', '123,212,42'); !!! caution "X-Location-Id use is deprecated" `X-Location-Id` is deprecated and removed in future. - For rendering content it's advised to refactor to use Content View, - if not applicable `ContentTagInterface` or lastly manually output tags. + For rendering content it's advised to refactor to use content view, if not applicable `ContentTagInterface` or lastly manually output tags. ## Response tagging in templates @@ -254,14 +248,13 @@ See [Tagging from Twig Templates](https://foshttpcachebundle.readthedocs.io/en/l ### Default tag purging -`ibexa/http-cache` uses repository API event subscribers to listen to events emitted on repository operations, -and depending on the operation triggers expiry on a specific tag or set of tags. +`ibexa/http-cache` uses repository API event subscribers to listen to events emitted on repository operations, and depending on the operation triggers expiry on a specific tag or set of tags. All event subscribers can be found in `http-cache/src/lib/EventSubscriber/CachePurge`. ### Tags purged on publish event -Below is an example of a Content structure. The tags which the content view controller adds to each location are -also listed +Below is an example of a content structure. +The tags which the content view controller adds to each location are also listed: ``` - [Home] (content-id=52, location-id=2) @@ -292,9 +285,10 @@ Effectively, in this example HTTP cache for `[Parent1]` and `[Child]` is cleared ### Tags purged on move event -With the same Content structure as above, the `[Child]` location is moved below `[Parent2]`. +With the same content structure as above, the `[Child]` location is moved below `[Parent2]`. The new structure is then: + ``` - [Home] (content-id=52, location-id=2) ez-all c52 ct42 l2 pl1 p1 p2 @@ -316,8 +310,7 @@ The following keys are purged during the move: - `pl21`, because cache for all children of new parent (`[Parent2]`) should be purged - `p22`, because cache for any element below `[Child]` should be purged (because path has changed) -In other words, HTTP Cache for `[Parent1]`, children of `[Parent1]` ( if any ), `[Parent2]`, children of `[Parent2]` ( if any ), -`[Child]` and any subtree below `[Child]`. +In other words, HTTP Cache for `[Parent1]`, children of `[Parent1]` ( if any ), `[Parent2]`, children of `[Parent2]` ( if any ), `[Child]` and any subtree below `[Child]`. ### Custom purging from code @@ -336,7 +329,7 @@ $purgeClient->purgeAll(); ### Purging from command line -Example for purging by Location and by Content ID: +Example for purging by Location and by content ID: ```bash bin/console fos:httpcache:invalidate:tag l44 c33 @@ -350,22 +343,21 @@ bin/console fos:httpcache:invalidate:tag ez-all !!! tip "Purge is done on the current repository" - Similarly to purging from code, the tags you purge on, are prefixed to match the currently configured SiteAccess. + Similarly to purging from code, the tags you purge on, are prefixed to match the currently configured SiteAccess. When you use this command in combination with multi-repository setup, make sure to specify SiteAccess argument. ## Testing and debugging HTTP cache -It's important to test your code in an environment which is as similar as your production environment as possible. That -means that if only are testing locally using the default Symfony Reverse proxy when your are going to use Varnish or -Fastly in production, you're likely ending up some (bad) surprises. Due to the symfony reverse proxy's lack of support for ESIs, it behaves -quite different from Varnish and Fastly in some aspects. +It's important to test your code in an environment which is as similar as your production environment as possible. +That means that if only are testing locally using the default Symfony Reverse proxy when your are going to use Varnish or Fastly in production, you're likely ending up some (bad) surprises. +Due to the symfony reverse proxy's lack of support for ESIs, it behaves quite different from Varnish and Fastly in some aspects. If you're going to use Varnish in production, make sure you also test your code with Varnish. -If you're going to use Fastly in production, testing with Fastly in your developer install is likely not feasible -(you're local development environment must then be accessible for Fastly). Testing with Varnish instead in most -cases does the job. But if you need to change the varnish configuration to make your site work, be aware that Varnish and Fastly uses different dialects, and -that .vcl code for Varnish V6.x doesn't likely work as-is on Fastly. +If you're going to use Fastly in production, testing with Fastly in your developer install is likely not feasible (you're local development environment must then be accessible for Fastly). +Testing with Varnish instead in most cases does the job. +But if you need to change the varnish configuration to make your site work, be aware that Varnish and Fastly uses different dialects, and that .vcl code for Varnish V6.x doesn't likely work as-is on Fastly. + +This section describes to how to debug problems related to HTTP cache. -This section describes to how to debug problems related to HTTP cache. You must be able to look both at responses and headers [[= product_name =]] sends to HTTP cache, and not so much at responses and headers the HTTP cache sends to the client (web browser). It means you must be able to send requests to your origin (web server) that don't go through Varnish or Fastly. @@ -373,7 +365,7 @@ This section describes to how to debug problems related to HTTP cache. If you perform tests on Fastly enabled environment on [[= product_name_cloud =]] provided by Platform.sh, you need to use the Platform.sh dashboard to obtain the endpoint for Nginx. -The following example shows how to debug and check why Fastly doesn't cache the front page properly. +The following example shows how to debug and check why Fastly doesn't cache the front page properly. If you run the command multiple times: `curl -IXGET https://www.staging.foobar.com.us-2.platformsh.site` @@ -390,12 +382,13 @@ x-cache: MISS #### Finding Nginx endpoint for environments located on the grid -To find the Nginx point, first, you need to know in which region your project is located. To do that, go to the Platform.sh dashboard. +To find the Nginx point, first, you need to know in which region your project is located. +To do that, go to the Platform.sh dashboard. To find a valid route, click an element in the **URLs** drop-down for the specified environment and select the route. A route may look like this: `https://www.staging.foobar.com.us-2.platformsh.site/` -In this case the region is `us-2` and you can find the public IP list on [Platform.sh documentation page](https://docs.platform.sh/development/regions.html#public-ip-addresses) +In this case the region is `us-2` and you can find the public IP list on [Platform.sh documentation page](https://docs.platform.sh/development/regions.html#public-ip-addresses). Typically, you can add a `gw` to the hostname and use nslookup to find it. ```bash @@ -416,7 +409,7 @@ You can also use the [[[= product_name_cloud =]] CLI](https://cli.ibexa.co/) (wh If you have a dedicated 3-node cluster on Platform.sh, the procedure for getting the endpoint to environments that are located on that cluster (`production` and sometimes also `staging`) is slightly different. In the **URLs** drop-down in the Platform.sh dashboard, find the route that has the format `somecontent.[clusterid].ent.platform.sh/`, for example, `myenvironment.abcdfg2323.ent.platform.sh/` -The endpoint in case has the format `c.[clusterid].ent.platform.sh`, for example, `c.asddfs2323.ent.platform.sh/` +The endpoint in case has the format `c.[clusterid].ent.platform.sh`, for example, `c.asddfs2323.ent.platform.sh/`. Next, use nslookup to find the IP: ```bash @@ -428,9 +421,8 @@ Next, use nslookup to find the IP: ### Fetching user context hash -As explained in [User Context Hash caching](context_aware_cache.md#user-context-hash-caching), the HTTP cache indexes the cache based on the -user-context-hash. Users with the same user-context-hash here the same cache (as long as [[= product_name =]] -responds with `Vary: X-Context-User-Hash`). +As explained in [User Context Hash caching](context_aware_cache.md#user-context-hash-caching), the HTTP cache indexes the cache based on the user-context-hash. +Users with the same user-context-hash here the same cache (as long as [[= product_name =]] responds with `Vary: X-Context-User-Hash`). To simulate the requests the HTTP cache sends to [[= product_name =]], you need this user-context-hash. To obtain it, use `curl`. @@ -443,8 +435,8 @@ Some notes about each of these parameters: - `-IXGET`, one of many ways to tell curl that we want to send a GET request, but we are only interested in outputting the headers - `--resolve www.staging.foobar.com.us-2.platformsh.site:443:1.2.3.4` - - We tell curl not to do a DNS lookup for `www.staging.foobar.com.us-2.platformsh.site`. We do that because in our case - that resolves to the Fastly endpoint, not our origin (nginx) + - We tell curl not to do a DNS lookup for `www.staging.foobar.com.us-2.platformsh.site`. + We do that because in our case that resolves to the Fastly endpoint, not our origin (nginx) - We specify `443` because we are using `https` - We provide the IP of the nginx endpoint at platform.sh (`1.2.3.4` in this example) - `--header "Surrogate-Capability: abc=ESI/1.0"`, strictly speaking not needed when fetching the user-context-hash, but this tells [[= product_name =]] that client understands ESI tags. @@ -452,12 +444,11 @@ Some notes about each of these parameters: - `--header "accept: application/vnd.fos.user-context-hash"` tells [[= product_name =]] that the client wants to receive the user-context-hash - `--header "x-fos-original-url: /"` is required by the fos-http-cache bundle to deliver the user-context-hash - `https://www.staging.foobar.com.us-2.platformsh.site/_fos_user_context_hash` : here we use the hostname we earlier told - curl how to resolve using `---resolve`. `/_fos_user_context_hash` is the route to the controller that are able to - deliver the user-context-hash. -- You may also provide the session cookie (`--cookie ".....=....") for a logged-in-user if you're interested in - the x-user-context-hash for a different user but anonymous + curl how to resolve using `---resolve`. `/_fos_user_context_hash` is the route to the controller that are able to deliver the user-context-hash. +- You may also provide the session cookie (`--cookie ".....=....") for a logged-in-user if you're interested in the x-user-context-hash for a different user but anonymous The output for this command should look similar to this: + ``` HTTP/1.1 200 OK Server: nginx/1.20.0 @@ -474,8 +465,7 @@ The output for this command should look similar to this: Surrogate-Key: ez-user-context-hash ez-all fos_http_cache_hashlookup- ``` -The header `X-User-Context-Hash` is the one of the interest here, but you may also note the `Surrogate-Key` which -holds the [cache tags](#cache-tags). +The header `X-User-Context-Hash` is the one of the interest here, but you may also note the `Surrogate-Key` which holds the [cache tags](#cache-tags). ### Fetching HTML response @@ -486,6 +476,7 @@ Now you have the user-context-hash, and you can ask origin for the actual resour ``` The output : + ``` HTTP/1.1 200 OK Server: nginx/1.20.0 @@ -502,16 +493,16 @@ Surrogate-Key: ez-all c52 ct42 l2 pl1 p1 p2 r56 r57 ``` The `Cache-Control` header tells the HTTP cache to store the result in the cache for 1 day (86400 seconds) -The `Vary: X-User-Content-Hash` header tells the HTTP cache that this cache element may be used for all users which has -the given `x-user-hash` (`daea248406c0043e62997b37292bf93a8c91434e8661484983408897acd93814`). +The `Vary: X-User-Content-Hash` header tells the HTTP cache that this cache element may be used for all users which has the given `x-user-hash` (`daea248406c0043e62997b37292bf93a8c91434e8661484983408897acd93814`). The document might also be removed from the cache by purging any of the keys provided in the `Surrogate-Key` header. -So back to the original problem here. This resource is for some reason not cached by Fastly ( remember the -`x-cache: MISS` we started with). But origin says this page can be cached for 1 day. How can that be? +So back to the original problem here. +This resource is for some reason not cached by Fastly (remember the `x-cache: MISS` we started with). +But origin says this page can be cached for 1 day. How can that be? The likely reason is that this page also contains some ESI fragments and that one or more of these aren't cachable. -So, first let's see if there are any ESIs here. We remove the `-IXGET` options (to see content of the response, -not only headers) to curl and search for esi: +So, first let's see if there are any ESIs here. +We remove the `-IXGET` options (to see content of the response, not only headers) to curl and search for esi: ```bash $ curl --resolve www.staging.foobar.com.us-2.platformsh.site:443:1.2.3.4 --header "Surrogate-Capability: abc=ESI/1.0" --header "x-user-context-hash: daea248406c0043e62997b37292bf93a8c91434e8661484983408897acd93814" https://www.staging.foobar.com.us-2.platformsh.site/ | grep esi @@ -525,9 +516,8 @@ The output is: ``` -Now, investigate the response of each of these ESI fragments to understand what is going on. it's important to -put that URL in single quotes as the URLS to the ESIs include special characters that can be interpreted by the -shell. +Now, investigate the response of each of these ESI fragments to understand what is going on. +It's important to put that URL in single quotes as the URLS to the ESIs include special characters that can be interpreted by the shell. #### 1st ESI @@ -554,7 +544,7 @@ X-Cache-Debug: 1 Surrogate-Key: ez-all c52 l2 ``` -The headers here look correct and don't indicate that this ESI isn't cached by the HTTP cache +The headers here look correct and don't indicate that this ESI isn't cached by the HTTP cache. The second ESI has a similar response. #### 3rd ESI @@ -583,20 +573,27 @@ X-Cache-Debug: 1 Surrogate-Key: ez-all ``` -The `Cache-Control` and `Vary` headers look correct. The request is handled by a custom controller and the `Surrogate-Key` only contains the default `ez-all` value. -This isn't a problem as long as the controller doesn't return values from any Content in the [[= product_name =]] repository. If it does, the controller should also add the corresponding IDs to such objects in that header. +The `Cache-Control` and `Vary` headers look correct. +The request is handled by a custom controller and the `Surrogate-Key` only contains the default `ez-all` value. +This isn't a problem as long as the controller doesn't return values from any content in the [[= product_name =]] repository. +If it does, the controller should also add the corresponding IDs to such objects in that header. + +The `Set-Cookie` here may cause the problem. +A ESI fragment should never set a cookie because: -The `Set-Cookie` here may cause the problem. A ESI fragment should never set a cookie because: - Clients only receive the headers set in the "mother" document (the headers in the "/" response in this case). -- Only the content of ESIs responses is returned to the client. **No headers set in the ESI response ever reach the client**. ESI headers are only seen by the HTTP cache. +- Only the content of ESIs responses is returned to the client. +**No headers set in the ESI response ever reach the client**. +ESI headers are only seen by the HTTP cache. -- Symfony reverse proxy doesn't support ESIs at all, and any ESI calls (`render_esi()`) are implicitly replaced by - sub-requests (`render()`). So any `Set-Cookie` **is** sent to the client when using Symfony reverse proxy. +- Symfony reverse proxy doesn't support ESIs at all, and any ESI calls (`render_esi()`) are implicitly replaced by sub-requests (`render()`). +So any `Set-Cookie` **is** sent to the client when using Symfony reverse proxy. -- Fastly flags it resource as "not cachable" because it set a cookie at least once. Even though that endpoint. - stops setting cookies, Fastly still doesn't cache that fragment. Any document referring to that ESI is a `MISS`. - Fastly cache needs to be purged (`Purge-all` request) to remove this flag. +- Fastly flags it resource as "not cachable" because it set a cookie at least once. +Even though that endpoint stops setting cookies, Fastly still doesn't cache that fragment. +Any document referring to that ESI is a `MISS`. +Fastly cache needs to be purged (`Purge-all` request) to remove this flag. - It means that it's not recommended to always initiate a session when loading the front page. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md index 90c286b8a8..9ba1f297ae 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/context_aware_cache.md @@ -7,10 +7,8 @@ description: Context-aware HTTP cache caches requests depending on the logged-in [[= product_name =]] allows caching requests made by logged-in users. This is called (user) context-aware cache. -It means that HTTP cache is unique per set of user permissions (roles and limitations), -and there are variations of cache shared only among users that have the exact same permissions. -So if a user browses a list of children Locations, they only see children Locations -they have access to, even if their rendering is served from HTTP cache. +It means that HTTP cache is unique per set of user permissions (roles and limitations), and there are variations of cache shared only among users that have the exact same permissions. +So if a user browses a list of children locations, they only see children locations they have access to, even if their rendering is served from HTTP cache. This is accomplished by varying on a header called `X-Context-User-Hash`, which the system populates on the request. The [logic for this](#request-lifecycle) is accomplished in the provided VCL for Varnish and Fastly. @@ -27,8 +25,7 @@ This expands steps covered in [FOSHttpCacheBundle documentation on user context 1. The caching proxy receives the hash response, copies the hash header to the client's original request for `/foo` and restarts the modified original request. 1. If the response to `/foo` should differ per user context, the application sets a `Vary: X-Context-User-Hash` header, which makes Proxy store the variations of this cache varying on the hash value. -The next time a request comes in from the same user, application lookup for the hash (step 3) doesn't take place, -as the hash lookup itself is cached by the cache proxy as described below. +The next time a request comes in from the same user, application lookup for the hash (step 3) doesn't take place, as the hash lookup itself is cached by the cache proxy as described below. ### User context hash caching @@ -50,21 +47,14 @@ It also varies on `Authorization` to cover any possible basic authorization head !!! note "Problems with stale user hash" - If you notice issues with stale hash usage, before you disable this cache, make sure login or logout always - generates new session IDs and performs a full redirect to make sure no requests are being made using stale - user context hashes. + If you notice issues with stale hash usage, before you disable this cache, make sure login or logout always generates new session IDs and performs a full redirect to make sure no requests are being made using stale user context hashes. !!! caution "Limitations of the user context hash" - If you use URI-based SiteAccess matching on a multi-repository installation (multiple databases), - the default SiteAccess on the domain needs to point to the same repository (database), - because `/_fos_user_context_hash` isn't SiteAccess-aware by default (see - `ibexa.rest.default_router.non_siteaccess_aware_routes` parameter). - This occurs because reverse proxy doesn't have knowledge about SiteAccesses - and it doesn't pass the whole URL to be able to cache the user context hash response. + If you use URI-based SiteAccess matching on a multi-repository installation (multiple databases), the default SiteAccess on the domain needs to point to the same repository (database), because `/_fos_user_context_hash` isn't SiteAccess-aware by default (see `ibexa.rest.default_router.non_siteaccess_aware_routes` parameter). + This occurs because reverse proxy doesn't have knowledge about SiteAccesses and it doesn't pass the whole URL to be able to cache the user context hash response. - The only known workaround is to make it SiteAccess aware, and have custom VCL logic tied to your SiteAccess - matching with Varnish/Fastly, to send the SiteAccess prefix as URI. + The only known workaround is to make it SiteAccess aware, and have custom VCL logic tied to your SiteAccess matching with Varnish/Fastly, to send the SiteAccess prefix as URI. !!! caution "Default options for FOSHttpCacheBundle" @@ -97,8 +87,7 @@ Here are some generic recommendations on how to approach personalized content wi Default VCL strips everything except session cookie, so this is effectively "per user". If you're on single-server setup without Varnish or Fastly, you can use the same cookie logic on the web server instead. -This a low effort solution, and can be enough for one fragment that is reused across the whole site, -for example, in header to show user name: +This a low effort solution, and can be enough for one fragment that is reused across the whole site, for example, in header to show user name: Example: @@ -109,8 +98,8 @@ Example: 2\. Ajax/JS lookup to "uncached" custom Symfony controllers: -This method doesn't consume memory in Varnish. -It can optionally be cached with custom logic: Symfony Cache on server side and/or with client side caching techniques. +This method doesn't consume memory in Varnish. +It can optionally be cached with custom logic: Symfony Cache on server side and/or with client side caching techniques. This should be done as Ajax/JS lookup to avoid the uncached request that slows down the whole delivery of Vanish if it's done as ESI. This solution requires more effort depending on project requirements (traffic load, etc.). @@ -123,8 +112,7 @@ This solution requires more effort (controller, VCL logic and adapting your own !!! tip "Dealing with paywall use cases" - If you need to handle a paywall on a per-item basis, or example, do a - lookup to backend for each URL where this is relevant. + If you need to handle a paywall on a per-item basis, or example, do a lookup to backend for each URL where this is relevant. You can find an example for paywall authorization in [FOSHTTPCache documentation](https://foshttpcache.readthedocs.io/en/latest/user-context.html#alternative-for-paywalls-authorization-request). @@ -136,19 +124,16 @@ For information on how user context hashes are generated, see [FOSHttpCacheBundl This is needed given [[= product_name =]]'s more complex permission model compared to Symfony's. You can technically extend the user context hash by [implementing your own custom context provider(s)](https://foshttpcachebundle.readthedocs.io/en/latest/reference/configuration/user-context.html#custom-context-providers). -However, **this is strongly discouraged** as it means increasing the amount of cache variations -stored in proxy for every single cache item, lowering cache hit ratio and increasing memory use. +However, **this is strongly discouraged** as it means increasing the amount of cache variations stored in proxy for every single cache item, lowering cache hit ratio and increasing memory use. -Instead, you can create your own hash header for use cases where you need it. +Instead, you can create your own hash header for use cases where you need it. This way only controllers and views that really vary by your custom logic varies on it. -You can do it using several methods, ranging from completely custom VCL logic and dedicated controller to respond with hash -to trusted proxy lookups, but this means additional lookups. +You can do it using several methods, ranging from completely custom VCL logic and dedicated controller to respond with hash to trusted proxy lookups, but this means additional lookups. ### Example for custom vary by logic -You can extend `/_fos_user_context_hash` lookup to add another HTTP header with custom hash for your -needs, and adapt the user context hash VCL logic to use the additional header. +You can extend `/_fos_user_context_hash` lookup to add another HTTP header with custom hash for your needs, and adapt the user context hash VCL logic to use the additional header. To avoid overloading any application code, take advantage of Symfony's event system: diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md index fbd1bcd7c1..6792fa9314 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/fastly.md @@ -4,16 +4,15 @@ description: Configure Fastly for use with Ibexa DXP. # Configure and customize Fastly -You can configure Fastly by using API calls or through the Fastly Web Interface. +You can configure Fastly by using API calls or through the Fastly Web Interface. Fastly provides a [Fastly CLI](https://developer.fastly.com/reference/cli/) for configuring Fastly through its API. -[[= product_name_cloud =]] is delivered with Fastly preconfigured. -It means that you don't have to do any changes to the Fastly configuration to make your site work. -The information provided here is only applicable if you want to change the default Fastly configuration on [[= product_name_cloud =]], -or if you're not using [[= product_name_cloud =]] and want to configure Fastly to work with [[= product_name =]] on premise. +[[= product_name_cloud =]] is delivered with Fastly preconfigured. +It means that you don't have to do any changes to the Fastly configuration to make your site work. +The information provided here is only applicable if you want to change the default Fastly configuration on [[= product_name_cloud =]], or if you're not using [[= product_name_cloud =]] and want to configure Fastly to work with [[= product_name =]] on premise. !!! note "The Fastly Web Interface isn't available for [[= product_name_cloud =]]" - It's recommend for [[= product_name_cloud =]] customers to use the Fastly CLI instead of using the Fastly API directly with `curl`, and so on. + It's recommend for [[= product_name_cloud =]] customers to use the Fastly CLI instead of using the Fastly API directly with `curl`, and more. !!! note "Disable Varnish when you use Fastly" Varnish is automatically provisioned on [[= product_name_cloud =]]. Varnish needs to be disabled on all environments that use @@ -34,7 +33,7 @@ FASTLY_KEY=... FASTLY_SERVICE_ID=... ``` -These credentials are different for your production and staging environments. +These credentials are different for your production and staging environments. When you configure the Fastly CLI, use the credentials for the environment that you want to change. !!! note "Different environment variable names between products" @@ -56,7 +55,7 @@ fastly service-version activate --version=latest ## Quick introduction to Fastly CLI Fastly configuration is versioned, which means that when you alter the configuration, you create a new version -and activate it. +and activate it. If needed, you can revert the configuration to one of previous versions at any point. ### List configuration versions @@ -99,10 +98,10 @@ fastly service-version clone --version=latest ``` !!! note "Command parameters" - Most Fastly CLI commands have the `--version` parameter. + Most Fastly CLI commands have the `--version` parameter. In addition to a specific version number, the `--version` parameter always supports aliases like `active` and `latest`. - Most Fastly CLI commands that alter the config also support the `--autoclone` parameter. + Most Fastly CLI commands that alter the config also support the `--autoclone` parameter. With such commands, when you use the `--autoclone` parameter, calling `fastly service-version clone` is no longer needed. ### Activate version @@ -115,7 +114,7 @@ fastly service-version activate --version=latest ## View and modify VCL configuration -Fastly configuration is stored in Varnish Configuration Language (VCL) files. +Fastly configuration is stored in Varnish Configuration Language (VCL) files. You can change the behaviour of Fastly by [uploading custom VCL files](https://docs.fastly.com/en/guides/uploading-custom-vcl). [[= product_name =]] ships with two VCL files that need to be enabled for Fastly to work correctly with the platform; `ez_main.vcl` and `ez_user_hash.vcl` (located in `vendor/ibexa/fastly/fastly/`) @@ -193,7 +192,7 @@ Versions: 8 ### Modify Fastly configuration -You can modify the existing Fastly configuration, for example, by uploading a modified `.vcl` file. +You can modify the existing Fastly configuration, for example, by uploading a modified `.vcl` file. Create a new version based on the one that is currently active, and upload the file: @@ -215,7 +214,7 @@ fastly service-version activate --version=latest ## Snippets -You can also add VCL code to the Fastly configuration without modifying the custom `.vcl` files directly. +You can also add VCL code to the Fastly configuration without modifying the custom `.vcl` files directly. You do it by creating [snippets](https://docs.fastly.com/en/guides/about-vcl-snippets). it's recommended that you use snippets instead of changing the VCL files provided by [[= product_name =]] as much as possible, which makes it easier to upgrade the [[= product_name =]] VCL configuration later. @@ -303,7 +302,7 @@ fastly service-version activate --version=latest ### Get diff between two versions -You can easily view the diff between two different versions by using the Fastly web interface. +You can view the diff between two different versions by using the Fastly web interface. Unfortunately, Fastly CLI doesn't support this functionality. However, Fastly API and GNU diff can help you get an identical result. @@ -346,7 +345,7 @@ Usernames and passwords can be stored inside the VCL file, but in this case cred ### Create and activate dictionary -Fastly configuration includes a dictionary named `basicauth`. +Fastly configuration includes a dictionary named `basicauth`. Using a dictionary instead of storing usernames directly in a `.vcl` file is beneficial, because you can add or remove records without having to create and activate new configuration versions. ``` bash @@ -390,8 +389,8 @@ fastly dictionary-entry list --dictionary-id=ltC6Rg4pqw4qaNKF5tEW33 ``` Now your dictionary stores new username and password. The next thing to do is to alter the Fastly VCL configuration -and add the basic-auth support. -This example uses [snippets](https://docs.fastly.com/en/guides/about-vcl-snippets), so that no changes are needed in the `.vcl` files that are shipped with [[= product_name =]]. +and add the basic-auth support. +This example uses [snippets](https://docs.fastly.com/en/guides/about-vcl-snippets), so that no changes are needed in the `.vcl` files that are shipped with [[= product_name =]]. You need two snippets, store these as files in your system: In `snippet_basic_auth_error.vcl`: @@ -480,4 +479,3 @@ fastly vcl snippet create --name="BasicAuth error" --version=latest --priority 1 fastly service-version activate --version=latest ``` - diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md index 10661012d0..3ef834ec29 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache.md @@ -4,13 +4,10 @@ description: Ibexa DXP's HTTP cache functionalities enable using reverse proxies # HTTP cache -[[= product_name =]] provides advanced caching features needed for its own content views, -to make Varnish and Fastly act as the view cache for the system. +[[= product_name =]] provides advanced caching features needed for its own content views, to make Varnish and Fastly act as the view cache for the system. This and other features allow [[= product_name =]] to be scaled up to serve high traffic websites and applications. -HTTP cache is handled by the [ibexa/http-cache](https://github.com/ibexa/http-cache) bundle, -which extends [friendsofsymfony/http-cache-bundle](https://foshttpcachebundle.readthedocs.io/en/latest/), -a Symfony community bundle that in turn extends [Symfony HTTP cache]([[= symfony_doc =]]/http_cache.html). +HTTP cache is handled by the [ibexa/http-cache](https://github.com/ibexa/http-cache) bundle, which extends [friendsofsymfony/http-cache-bundle](https://foshttpcachebundle.readthedocs.io/en/latest/), a Symfony community bundle that in turn extends [Symfony HTTP cache]([[= symfony_doc =]]/http_cache.html). For content view responses coming from [[= product_name =]] itself, this means that: diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache_configuration.md b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache_configuration.md index bea19428b5..e087d374b9 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/http_cache_configuration.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/http_cache_configuration.md @@ -26,7 +26,8 @@ As the system takes care of purges, the cache should not become stale with the e ## Cache header rules -A few redirect and error pages are served through the content view system. If you set a high `default_ttl`, they can also be served from cache. +A few redirect and error pages are served through the content view system. +If you set a high `default_ttl`, they can also be served from cache. To avoid this, the installation ships with configuration to match these specific situations and set a much lower TTL. [FOSHttpCacheBundle matching rules](https://foshttpcachebundle.readthedocs.io/en/latest/reference/configuration/headers.html) enables you to specify a different TTL: @@ -68,11 +69,9 @@ fos_http_cache: ## Time-to-live value for Page blocks For the Page Builder, block cache by default respects `$content.ttl_cache$` and `$content.default_ttl$` settings. -However, if the given block value has a since or till date, -it's taken into account for the TTL calculation for both the block and the whole page. +However, if the given block value has a since or till date, it's taken into account for the TTL calculation for both the block and the whole page. -To overload this behavior, listen to [`BlockResponseEvents::BLOCK_RESPONSE`](page_events.md), -and set priority to `-200` to adapt what Page field type does by default. +To overload this behavior, listen to [`BlockResponseEvents::BLOCK_RESPONSE`](page_events.md), and set priority to `-200` to adapt what Page field type does by default. For example, to disable cache for the block, use `$event->getResponse()->setPrivate()`. @@ -80,19 +79,17 @@ For example, to disable cache for the block, use `$event->getResponse()->setPriv [Edge Side Includes](https://symfony.com/doc/current/http_cache/esi.html) (ESI) can be used to split out the different parts of a web page into separate fragments that can be freely reused as pieces by reverse proxy. -In practice, with ESI, every sub-request is regenerated from application perspective. And while you can tune your system to reduce this, it always causes additional overhead in the following situations: +In practice, with ESI, every sub-request is regenerated from application perspective. +And while you can tune your system to reduce this, it always causes additional overhead in the following situations: - When cache is cold on all or some of the sub-requests - With Symfony Proxy (AppCache) there is always some overhead, even on warm cache (hits) - In development environment -This may differ depending on your system, however, it's recommended to stay below 5 ESI -requests per page and only using them for parts that are the same across the whole site or larger parts of it. +This may differ depending on your system, however, it's recommended to stay below 5 ESI requests per page and only using them for parts that are the same across the whole site or larger parts of it. -You should not use ESI for parts that are effectively uncached, -because your reverse proxy has to wait for the back end and cannot deliver cached pages directly. +You should not use ESI for parts that are effectively uncached, because your reverse proxy has to wait for the back end and cannot deliver cached pages directly. !!! note "ESI limitations with the URIElement SiteAccess matcher" - Is isn't possible to share ESIs across the SiteAccesses when using URI matching - as URI contains the SiteAccess name encoded in its path information. + Is isn't possible to share ESIs across the SiteAccesses when using URI matching as URI contains the SiteAccess name encoded in its path information. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md index 59fa7cb26a..f16231a4b6 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/reverse_proxy.md @@ -44,8 +44,7 @@ Using a different proxy is highly recommended as they provide better performance ## VCL base files -For reverse proxies to work properly with your installation, you need to add the corresponding VCL files for your -HTTP Cache. +For reverse proxies to work properly with your installation, you need to add the corresponding VCL files for your HTTP Cache. - [Varnish VCL xkey example](https://github.com/ibexa/http-cache/blob/main/docs/varnish/vcl/varnish5.vcl) - Fastly can be found in `vendor/ibexa/fastly/fastly`. You must install the following to use Fastly: @@ -57,12 +56,9 @@ The provided `.vcl` files work both with [Fastly Shielding](https://docs.fastly. If you decide to use Fastly VCL, consider using [Fastly CLI](https://developer.fastly.com/learning/tools/cli/#installing) with it to manage VCL files from the command line. To learn more, see [Prepare to use Fastly locally](fastly.md#prepare-for-using-fastly-locally) and [Introduction to Fastly CLI](fastly.md#quick-introduction-to-fastly-cli). -!!! tip - Support for Fastly Shielding was added in [[= product_name =]] v3.3.24 and v4.1.6 +!!! tip "Support for Fastly Shielding was added in [[= product_name =]] v3.3.24 and v4.1.6" - When you extend [FOSHttpCacheBundle](https://foshttpcachebundle.readthedocs.io/en/latest/), - you can also adapt your VCL further with [FOSHttpCache documentation](https://foshttpcache.readthedocs.io/en/latest/varnish-configuration.html) - to use additional features. + When you extend [FOSHttpCacheBundle](https://foshttpcachebundle.readthedocs.io/en/latest/), you can also adapt your VCL further with [FOSHttpCache documentation](https://foshttpcache.readthedocs.io/en/latest/varnish-configuration.html) to use additional features. ## Configure Varnish and Fastly @@ -78,8 +74,7 @@ Failing to configure reverse proxies correctly may introduce several problems, i You need to consider your `TrustedProxy` configuration when you use Symfony [behind a load balancer or a reverse proxy](https://symfony.com/doc/5.1/deployment/proxies.html). -To configure trusted proxies, use [Symfony semantic configuration]([[= symfony_doc =]]/deployment/proxies.html#solution-settrustedproxies) under -the `framework.trusted_proxies` [configuration key](configuration.md#configuration-files), for example: +To configure trusted proxies, use [Symfony semantic configuration]([[= symfony_doc =]]/deployment/proxies.html#solution-settrustedproxies) under the `framework.trusted_proxies` [configuration key](configuration.md#configuration-files), for example: ``` yaml framework: @@ -90,31 +85,28 @@ framework: On Platform.sh, Varnish doesn't have a static IP, like with [AWS LB](https://symfony.com/doc/5.1/deployment/proxies.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly). For this reason, the `TRUSTED_PROXIES` env variable supports being set to value `REMOTE_ADDR`, which is equal to: - + ```php Request::setTrustedProxies([$request->server->get('REMOTE_ADDR')], Request::HEADER_X_FORWARDED_ALL); ``` - When trusting remote IP like this, make sure your application is only accessible through Varnish. + When trusting remote IP like this, make sure your application is only accessible through Varnish. If it's accessible in other ways, this may result in trusting, for example, the IP of client browser instead, which would be a serious security issue. - Make sure that **all** traffic always comes from the trusted proxy/load balancer, - and that there is no other way to configure it. + Make sure that **all** traffic always comes from the trusted proxy/load balancer, and that there is no other way to configure it. When using Fastly, you need to set `trusted_proxies` according to the [IP ranges used by Fastly](https://api.fastly.com/public-ip-list). !!! tip You don't have to set `trusted_proxies` when using Fastly on Platform.sh. - The Platform.sh router automatically changes the source IP of requests coming from Fastly, - replacing the source IP with the actual client IP and removing any `X-FORWARD-...` header in the request before it reaches [[= product_name =]]. + The Platform.sh router automatically changes the source IP of requests coming from Fastly, replacing the source IP with the actual client IP and removing any `X-FORWARD-...` header in the request before it reaches [[= product_name =]]. For more information about setting these variables, see [Configuration examples](#configuration-examples). ### Update YML configuration -Next, you need to tell [[= product_name =]] to use an HTTP-based purge client (specifically the FosHttpCache Varnish purge client), -and specify the URL that Varnish can be reached on: +Next, you need to tell [[= product_name =]] to use an HTTP-based purge client (specifically the FosHttpCache Varnish purge client), and specify the URL that Varnish can be reached on: | Configuration | Parameter| Environment variable| Possible values| |---------|--------|--------|----------| @@ -124,8 +116,7 @@ and specify the URL that Varnish can be reached on: | `ibexa.system..http_cache.fastly.service_id` | `fastly_service_id` | `FASTLY_SERVICE_ID` | Service ID to authenticate with Fastly. | | `ibexa.system..http_cache.fastly.key` | `fastly_key` | `FASTLY_KEY` | Service key/token to authenticate with Fastly. | -If you need to set multiple purge servers, configure them in the YAML configuration, -instead of parameter or environment variable, as they only take single string value. +If you need to set multiple purge servers, configure them in the YAML configuration, instead of parameter or environment variable, as they only take single string value. Example configuration for Varnish as reverse proxy, providing that [front controller has been configured](#configure-symfony-front-controller): @@ -144,15 +135,13 @@ ibexa: !!! note "Invalidating Varnish cache using tokens" - In setups where the Varnish server IP can change (for example, on [[= product_name_cloud =]]), - you can use token-based cache invalidation through [`ez_purge_acl`](https://github.com/ibexa/http-cache/blob/main/docs/varnish/vcl/varnish5.vcl#L174). - + In setups where the Varnish server IP can change (for example, on [[= product_name_cloud =]]), you can use token-based cache invalidation through [`ez_purge_acl`](https://github.com/ibexa/http-cache/blob/main/docs/varnish/vcl/varnish5.vcl#L174). + In such situation, use strong, secure hash and make sure to keep the token secret. ### Ensure proper Captcha behavior [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -If your installation uses Varnish and you want users to be able to configure and use Captcha in their forms, -you must enable sending Captcha data as a response to an Ajax request. +If your installation uses Varnish and you want users to be able to configure and use Captcha in their forms, you must enable sending Captcha data as a response to an Ajax request. Otherwise, Varnish doesn't allow for the transfer of Captcha data to the form, and as a result, users see an empty image. To enable sending Captcha over Ajax, add the following configuration: @@ -168,8 +157,7 @@ ibexa: ### Update custom Captcha block [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -If you created a custom Captcha block for your site by overriding the default file (`vendor/gregwar/captcha-bundle/Resources/views/captcha.html.twig`), -you must make the following changes to the custom block template file: +If you created a custom Captcha block for your site by overriding the default file (`vendor/gregwar/captcha-bundle/Resources/views/captcha.html.twig`), you must make the following changes to the custom block template file: - change the name of the block to `ajax_captcha_widget` - include the JavaScript file: @@ -228,12 +216,12 @@ FASTLY_KEY="token" #### Configure Fastly on Platform.sh If you use Platform.sh, it's recommended to configure all environment variables through [Platform.sh variables](https://docs.platform.sh/guides/ibexa/fastly.html). -In [[= product_name =]], Varnish is enabled by default. To use Fastly, first you must -[disable Varnish](https://docs.platform.sh/guides/ibexa/fastly.html#remove-varnish-configuration) +In [[= product_name =]], Varnish is enabled by default. To use Fastly, first you must [disable Varnish](https://docs.platform.sh/guides/ibexa/fastly.html#remove-varnish-configuration). #### Get Fastly service ID and API token -To get the service ID, log in to https://www.fastly.com/. In the upper menu, click the **CONFIGURE** tab. +To get the service ID, log in to https://www.fastly.com/. +In the upper menu, click the **CONFIGURE** tab. The service ID is displayed next to the name of your service on any page. For instructions on how to generate a Fastly API token, see [the Fastly guide](https://docs.fastly.com/en/guides/using-api-tokens). @@ -270,8 +258,7 @@ You can configure environment variables through [Platform.sh variables](https:// !!! tip - For HTTP cache, you most likely only use this for configuring Fastly for production and optionally staging, - allowing `variables:env:` in `.platform.app.yaml` to, for example, specify Varnish or Symfony proxy as default for dev environment. + For HTTP cache, you most likely only use this for configuring Fastly for production and optionally staging, allowing `variables:env:` in `.platform.app.yaml` to, for example, specify Varnish or Symfony proxy as default for dev environment. #### Apache with Varnish @@ -308,29 +295,25 @@ Stale cache, or grace mode in Varnish, occurs when: - Cache is served some time after the TTL expired. - When the back-end server doesn't respond. -This has several benefits for high traffic installations to reduce load to the back end. -Instead of creating several concurrent requests for the same page to the back end, -the following happens when a page has been soft purged: +This has several benefits for high traffic installations to reduce load to the back end. +Instead of creating several concurrent requests for the same page to the back end, the following happens when a page has been soft purged: - Next request hitting the cache triggers an asynchronous lookup to the back end. -- If cache is still within grace period, first and subsequent requests for the content are served from cache, -and don't wait for the asynchronous lookup to finish. +- If cache is still within grace period, first and subsequent requests for the content are served from cache, and don't wait for the asynchronous lookup to finish. - The back-end lookup finishes and refreshes the cache so any subsequent requests get a fresh cache. -By default, [[= product_name =]] always soft purges content on reverse proxies that support it (Varnish and Fastly), -with the following logic in the out-of-the-box VCL: +By default, [[= product_name =]] always soft purges content on reverse proxies that support it (Varnish and Fastly), with the following logic in the out-of-the-box VCL: - Cache is within grace period. - Either the server isn't responding, or the request comes without a session cookie (anonymous user). Serving grace isn't always allowed by default because: -- It's a safe default. Even if just for anonymous users, stale cache can easily be confusing during acceptance testing. +- It's a safe default. Even if for anonymous users, stale cache can be confusing during acceptance testing. - It means REST API, which is used by the back office, would serve stale data, breaking the UI. !!! tip "Customizing stale cache handling" - If you want to use grace handling for logged-in users as well, you can adapt the provided VCL to add a condition - for opting out if the request has a cookie and the path contains REST API prefix to make sure the back office isn't negatively affected. + If you want to use grace handling for logged-in users as well, you can adapt the provided VCL to add a condition for opting out if the request has a cookie and the path contains REST API prefix to make sure the back office isn't negatively affected. If you want to disable grace mode, you can adapt the VCL to do hard instead of soft purges, or set grace/stale time to `0s`. diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index cc47ce2d0b..bfd06f53d9 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -10,18 +10,17 @@ description: Persistence cache caches SPI\Persistence calls used in common page Persistence cache can best be described as an implementation of `SPI\Persistence` that decorates the main backend implementation, aka Storage Engine *(currently: "Legacy Storage Engine")*. -As shown in the illustration, this is done in the exact same way as the Event layer is a custom implementation of `API\Repository` decorating the main repository. +As shown in the illustration, this is done in the exact same way as the event layer is a custom implementation of `API\Repository` decorating the main repository. In the case of Persistence Cache, instead of sending events on calls passed on to the decorated implementation, most of the load calls are cached, and calls that perform changes purge the affected caches. Cache handlers *(Memcached, Redis, Filesystem, etc.)* can be configured using Symfony configuration. For details on how to reuse this Cache service in your own custom code, see below. ## Transparent cache -With the persistence cache, just like with the HTTP cache, [[= product_name =]] tries to follow principles of transparent caching. -This can shortly be described as a cache which is invisible to the end user (admin/editors) of [[= product_name =]] where content -is always returned *fresh*. In other words, there should be no need to manually clear the cache like it was frequently -the case with eZ Publish 4.x. This is possible thanks to an interface that follows CRUD (Create Read Update Delete) -operations per domain. +With the persistence cache, like with the HTTP cache, [[= product_name =]] tries to follow principles of transparent caching. +This can shortly be described as a cache which is invisible to the end user (admin/editors) of [[= product_name =]] where content is always returned *fresh*. +In other words, there should be no need to manually clear the cache like it was frequently the case with eZ Publish 4.x. +This is possible thanks to an interface that follows CRUD (Create Read Update Delete) operations per domain. ## What is cached? @@ -36,8 +35,7 @@ Notes: - Search isn't defined as persistence and the queries themselves aren't planned to be cached as they're too complex by design (for example, full text). Use [Solr](solr_overview.md) which caches this for you to improve scale/performance, and to offload your database. -For further details on which calls are cached or not, see details in the [Symfony Web Debug Toolbar](devops.md#web-debug-toolbar) -which has info on cache use in two places: +For further details on which calls are cached or not, see details in the [Symfony Web Debug Toolbar](devops.md#web-debug-toolbar) which has info on cache use in two places: - Symfony Cache tab: for Symfony Cache itself, the tab shows cache lookups to cache backends - [[= product_name_base =]] tab: shows calls made to database back end, and if they're cached or not @@ -48,8 +46,8 @@ To see where and how to contribute additional caches, refer to the [source code] !!! note - Current implementation uses Symfony cache. It technically supports the following cache backends: - [APCu, Array, Chain, Doctrine, Filesystem, Memcached, PDO & Doctrine DBAL, Php Array, Proxy, Redis]([[= symfony_doc =]]/components/cache/cache_pools.html#creating-cache-pools). + Current implementation uses Symfony cache. + It technically supports the following cache backends: [APCu, Array, Chain, Doctrine, Filesystem, Memcached, PDO & Doctrine DBAL, Php Array, Proxy, Redis]([[= symfony_doc =]]/components/cache/cache_pools.html#creating-cache-pools). [[= product_name =]] officially supports only using Filesystem for single server and Redis or Memcached for clustered setups. Use of Memcached or Redis as shared cache back end is a requirement for use in clustering setup. @@ -61,8 +59,7 @@ Filesystem adapters, for example, are **not** intended to be used over a shared The underlying cache system is exposed as an `ibexa.cache_pool` service, and can be reused by any other service as described in the [Using Cache service](#using-cache-service) section. By default, configuration uses the `cache.tagaware.filesystem` service to store cache files. -The service is defined in `config/packages/cache_pool/cache.tagaware.filesystem.yaml` -to use [FilesystemTagAwareAdapter](https://github.com/ibexa/recipes/blob/master/ibexa/oss/4.0/config/packages/cache_pool/cache.tagaware.filesystem.yaml#L8). +The service is defined in `config/packages/cache_pool/cache.tagaware.filesystem.yaml` to use [FilesystemTagAwareAdapter](https://github.com/ibexa/recipes/blob/master/ibexa/oss/4.0/config/packages/cache_pool/cache.tagaware.filesystem.yaml#L8). You can select a different cache backend and configure its parameters in the relevant file in the `cache_pool` folder. @@ -85,7 +82,7 @@ ibexa: !!! note "One cache pool for each repository" - If your installation has several Repositories *(databases)*, make sure every group of sites using different Repositories also uses a different cache pool. + If your installation has several repositories *(databases)*, make sure every group of sites using different Repositories also uses a different cache pool. ### In-Memory cache configuration @@ -129,8 +126,7 @@ parameters: [Redis](https://redis.io/), an in-memory data structure store, is one of the supported cache solutions for clustering. Redis is used via [Redis pecl extension](https://pecl.php.net/package/redis). -See [Redis Cache Adapter in Symfony documentation]([[= symfony_doc =]]/components/cache/adapters/redis_adapter.html#configure-the-connection) -for information on how to connect to Redis. +See [Redis Cache Adapter in Symfony documentation]([[= symfony_doc =]]/components/cache/adapters/redis_adapter.html#configure-the-connection for information on how to connect to Redis. #### Supported Adapters @@ -186,7 +182,7 @@ See `.env`, `config/packages/ibexa.yaml` and `config/packages/cache_pool/cache.r The regular `php bin/console cache:clear` command doesn't clear Redis persistence cache. Use a dedicated Symfony command to clear the pool you have configured: `php bin/console cache:pool:clear cache.redis`. -##### Redis Clustering +##### Redis clustering Persistence cache depends on all involved web servers, each of them seeing the same view of the cache because it's shared among them. With that in mind, the following configurations of Redis are possible: @@ -218,8 +214,7 @@ Several cloud providers have managed services that are easier to set up, handle [Memcached, a distributed caching solution](http://memcached.org/) is a cache solution that is supported for clustering use, as an alternative to Redis. -See [Memcached Cache Adapter in Symfony documentation]([[= symfony_doc =]]/components/cache/adapters/memcached_adapter.html#configure-the-connection) -for information on how to configure Memcached. +See [Memcached Cache Adapter in Symfony documentation]([[= symfony_doc =]]/components/cache/adapters/memcached_adapter.html#configure-the-connection) for information on how to configure Memcached. #### Supported Adapters @@ -230,7 +225,8 @@ There is one Memcached adapter available out of the box. **Pros**: Memcached is able to handle much more concurrent load by design (multi threaded), and typically uses far less memory than Redis in general due to a simpler data structure. -**Cons**: 1.5-2x more lookups to the back-end cache server then `RedisTagAwareAdapter`. Depending on the number of lookups and latency to cache server this might affect page load time. +**Cons**: 1.5-2x more lookups to the back-end cache server then `RedisTagAwareAdapter`. +Depending on the number of lookups and latency to cache server this might affect page load time. #### Adjusting configuration @@ -278,12 +274,16 @@ See `config/default_parameters.yaml` and `config/cache_pool/cache.memcached.yaml > -l <addr> - > Listen on <addr>; default to INADDR\_ANY. <addr> may be specified as host:port. If you don't specify a port number, the value you specified with -p or -U is used. You may specify multiple addresses separated by comma or by using -l multiple times. This is an important option to consider as there is no other way to secure the installation. Binding to an internal or firewalled network interface is suggested. + > Listen on <addr>; default to INADDR\_ANY. <addr> may be specified as host:port. + If you don't specify a port number, the value you specified with -p or -U is used. + You may specify multiple addresses separated by comma or by using -l multiple times. + This is an important option to consider as there is no other way to secure the installation. + Binding to an internal or firewalled network interface is suggested. ## Using cache service Using the internal cache service allows you to use an interface and without caring whether the system is configured to place the cache in Memcached or on File system. -And as [[= product_name =]] requires that instances use a cluster-aware cache in Cluster setup, you can safely assume your cache is shared *(and invalidated)* across all web servers. +And as [[= product_name =]] requires that instances use a cluster-aware cache in cluster setup, you can safely assume your cache is shared *(and invalidated)* across all web servers. !!! note @@ -300,7 +300,7 @@ And as [[= product_name =]] requires that instances use a cluster-aware cache in ##### With dependency injection -In your Symfony services configuration you can simply define that you require the cache service in your configuration like so: +In your Symfony services configuration you can define that you require the cache service in your configuration like so: ``` yaml # yml configuration From eda8f7609128b8e3e4fd908e998711467a9ef87c Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:03:45 +0200 Subject: [PATCH 39/77] Fixes in 'clustering' --- .../clustering/clustering.md | 29 +++++++++---------- .../clustering/clustering_with_aws_s3.md | 8 ++--- .../clustering/clustering_with_ddev.md | 4 +-- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/docs/infrastructure_and_maintenance/clustering/clustering.md b/docs/infrastructure_and_maintenance/clustering/clustering.md index 3760d7fb36..20ec49db58 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering.md @@ -34,7 +34,8 @@ It's also recommended to use: ### Shared persistence cache -Redis is the recommended cache solution for clustering. An alternative solution is using Memcached. +Redis is the recommended cache solution for clustering. +An alternative solution is using Memcached. See [persistence cache documentation](persistence_cache.md#persistence-cache-configuration) on information on how to configure them. @@ -66,10 +67,8 @@ It uses a database to manipulate metadata, making up for the potential inconsist You need to configure both metadata and binarydata handlers. -[[= product_name =]] ships with a custom local adapter (`ibexa.io.nfs.adapter.site_access_aware`), -which decorates the Flysystem v2 local adapter to enable support for SiteAccess-aware settings. -If an NFS path relies on SiteAccess-aware dynamic parameters, you must use the custom local adapter -instead of the Flysystem v2 local adapter. +[[= product_name =]] ships with a custom local adapter (`ibexa.io.nfs.adapter.site_access_aware`), which decorates the Flysystem v2 local adapter to enable support for SiteAccess-aware settings. +If an NFS path relies on SiteAccess-aware dynamic parameters, you must use the custom local adapter instead of the Flysystem v2 local adapter. Configure the custom local adapter to read/write to the NFS mount point on each local server. As metadata handler, create a DFS one, configured with a Doctrine connection. @@ -90,10 +89,9 @@ or `DATABASE_URL=postgresql://root:rootpassword@127.0.0.1:3306/ibexa_dfs?serverVersion=8.0` -For production, it's recommended to create the DFS table in its own database, -manually importing its schema definition: +For production, it's recommended to create the DFS table in its own database, manually importing its schema definition: -??? note "dfs_schema.sql (MySQL)" +!!! note "dfs_schema.sql (MySQL)" ``` sql CREATE TABLE ezdfsfile ( @@ -114,7 +112,7 @@ manually importing its schema definition: ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` -??? note "dfs_schema.sql (PostgreSQL)" +!!! note "dfs_schema.sql (PostgreSQL)" ``` sql CREATE TABLE ezdfsfile ( @@ -198,13 +196,13 @@ ibexa: !!! tip - If you're looking to [set up S3](clustering_with_aws_s3.md) or other [Flysystem](https://flysystem.thephpleague.com/docs/)/third-party adapters like Google Cloud Storage, this needs to be configured as binary handler. The rest here still stays the same, the DFS metadata handler takes care of caching the lookups to avoid slow IO lookups. + If you're looking to [set up S3](clustering_with_aws_s3.md) or other [Flysystem](https://flysystem.thephpleague.com/docs/)/third-party adapters like Google Cloud Storage, this needs to be configured as binary handler. + The rest here still stays the same, the DFS metadata handler takes care of caching the lookups to avoid slow IO lookups. #### Customizing the storage directory Earlier versions required the NFS adapter directory to be set to `$var_dir$/$storage_dir$` part for the NFS path. -This is no longer required, -but the default prefix used to serve binary files still matches this expectation. +It's no longer required, but the default prefix used to serve binary files still matches this expectation. If you decide to change this setting, make sure you also set `io.url_prefix` to a matching value. If you set the NFS adapter's directory to `/path/to/nfs/storage`, use this configuration so that the files can be served by Symfony: @@ -218,8 +216,7 @@ ibexa: ``` As an alternative, you may serve images from NFS using a dedicated web server. -If in the example above, this server listens on `http://static.example.com/` -and uses `/path/to/nfs/storage` as the document root, configure `io.url_prefix` as follows: +If in the example above, this server listens on `http://static.example.com/` and uses `/path/to/nfs/storage` as the document root, configure `io.url_prefix` as follows: ``` yaml ibexa: @@ -236,7 +233,7 @@ You can read more about that on [Binary files URL handling](file_url_handling.md The default [[= product_name =]] rewrite rules let image requests be served directly from disk. In a cluster setup, files matching `^/var/([^/]+/)?storage/images(-versioned)?/.*` have to be passed through `/public/index.php` instead. -In any case, this specific rewrite rule must be placed before the ones that "ignore" image files and just let the web server serve the files directly. +In any case, this specific rewrite rule must be placed before the ones that "ignore" image files and let the web server serve the files directly. #### Apache @@ -285,4 +282,4 @@ If `--to` is omitted, the first non-default IO configuration is used. While the command is running, the files should not be modified. To avoid surprises you should create a [backup](backup.md) and/or execute a dry run before doing the actual update, using the `--dry-run` switch. -Since this command can run for a very long time, to avoid memory exhaustion run it in the production environment using the `--env=prod` switch. +Since this command can run for a long time, to avoid memory exhaustion run it in the production environment using the `--env=prod` switch. diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md index 8ca764d9b6..a3492b251f 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_aws_s3.md @@ -30,7 +30,7 @@ The secret key cannot be retrieved again after the key has been created, so don' !!! note Make sure that your bucket is [configured as Public](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configuring-block-public-access-bucket.html) to avoid facing 403 errors, as the current S3 handler is meant to store files publicly so they can be served directly from S3. - + ## Set up [[= product_name =]] for AWS S3 In your [[= product_name =]] root directory, run `php composer require league/flysystem-aws-s3-v3:^2.0`. @@ -75,8 +75,7 @@ ibexa_io: `aws_s3` is an arbitrary handler identifier that is used in the config block below. You can configure multiple handlers. - For example, you could configure one called `gcloud_storage` for a - [Google Cloud Storage adapter](https://github.com/thephpleague/flysystem#officially-supported-adapters). + For example, you could configure one called `gcloud_storage` for a [Google Cloud Storage adapter](https://github.com/thephpleague/flysystem#officially-supported-adapters). Under the `ibexa.system..io` [configuration key](configuration.md#configuration-files), enable the binary data handler: @@ -94,5 +93,4 @@ Clear all caches and reload, and that's it. ## Migrate your existing binary data to S3 -You can [migrate existing binary data](clustering.md#migrating-to-a-cluster-setup) to S3 using the `php bin/console ibexa:io:migrate-files` command -which was added in [EZP-25946](https://issues.ibexa.co/browse/EZP-25946). +You can [migrate existing binary data](clustering.md#migrating-to-a-cluster-setup) to S3 using the `php bin/console ibexa:io:migrate-files` command which was added in [EZP-25946](https://issues.ibexa.co/browse/EZP-25946). diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md index a5386e78e0..0582a20d22 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md @@ -18,7 +18,7 @@ But the data sharing needed by a cluster of several servers can still be emulate The `ddev config --php-version` option should set the same PHP version as the production servers. !!! tip - + - [`ddev describe`](https://ddev.readthedocs.io/en/latest/users/usage/commands/#describe) displays a cluster summary that include accesses from inside and outside DDEV services - [`ddev ssh`](https://ddev.readthedocs.io/en/latest/users/usage/commands/#ssh) opens a terminal inside a service - [`ddev exec`](https://ddev.readthedocs.io/en/latest/users/usage/commands/#exec) executes a command inside a service @@ -79,7 +79,7 @@ You can now check whether Solr works. For example, the `ddev exec curl -s http://solr:8983/api/cores/` command: - - checks whether the `web` server can access the `solr` server, + - checks whether the `web` server can access the `solr` server - checks whether `collection1` exists and its status - displays `collection1`'s `numDocs` that shouldn't be zero if indexing worked correctly From 9011431f1fac48c34ffd28b99ec5dcb3eaf16f3d Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:11:07 +0200 Subject: [PATCH 40/77] Fixes in 'security' --- .../security/development_security.md | 15 ++- .../security/reporting_issues.md | 8 +- .../security/security_checklist.md | 127 +++++++++--------- 3 files changed, 77 insertions(+), 73 deletions(-) diff --git a/docs/infrastructure_and_maintenance/security/development_security.md b/docs/infrastructure_and_maintenance/security/development_security.md index 92969ba847..9300660e2b 100644 --- a/docs/infrastructure_and_maintenance/security/development_security.md +++ b/docs/infrastructure_and_maintenance/security/development_security.md @@ -10,8 +10,7 @@ description: Ensure the security of your Ibexa DXP installation by using one of !!! note "Security checklist" - See the [Security checklist](security_checklist.md) for a list of security-related issues - you should take care of before going live with a project. + See the [Security checklist](security_checklist.md) for a list of security-related issues you should take care of before going live with a project. ## Symfony authentication @@ -52,11 +51,13 @@ logout: Authentication is provided using the Symfony Security component. -[Native and universal `form_login`]([[= symfony_doc =]]/security/form_login_setup.html) is used, in conjunction with an extended `DaoAuthenticationProvider` (DAO stands for *Data Access Object*), the `RepositoryAuthenticationProvider`. Native behavior of `DaoAuthenticationProvider` has been preserved, making it possible to still use it for pure Symfony applications. +[Native and universal `form_login`]([[= symfony_doc =]]/security/form_login_setup.html) is used, in conjunction with an extended `DaoAuthenticationProvider` (DAO stands for *Data Access Object*), the `RepositoryAuthenticationProvider`. +Native behavior of `DaoAuthenticationProvider` has been preserved, making it possible to still use it for pure Symfony applications. #### Security controller -A `SecurityController` is used to manage all security-related actions and is thus used to display the login form. It follows all standards explained in [Symfony security documentation]([[= symfony_doc =]]/security/form_login_setup.html). +A `SecurityController` is used to manage all security-related actions and is thus used to display the login form. +It follows all standards explained in [Symfony security documentation]([[= symfony_doc =]]/security/form_login_setup.html). The base template used is [`Security/login.html.twig`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Resources/views/Security/login.html.twig). @@ -94,14 +95,14 @@ If you want to use this feature, you must at least extend the login template to #### Login handlers / SSO -Symfony provides native support for [multiple user providers]([[= symfony_doc =]]/security/multiple_user_providers.html). This makes it easy to integrate any kind of login handlers, including SSO and existing third-party bundles (for example, [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), etc.). +Symfony provides native support for [multiple user providers]([[= symfony_doc =]]/security/multiple_user_providers.html). +This makes it easy to integrate any kind of login handlers, including SSO and existing third-party bundles (for example, [FR3DLdapBundle](https://github.com/Maks3w/FR3DLdapBundle), [HWIOauthBundle](https://github.com/hwi/HWIOAuthBundle), [FOSUserBundle](https://github.com/FriendsOfSymfony/FOSUserBundle), [BeSimpleSsoAuthBundle](https://github.com/BeSimple/BeSimpleSsoAuthBundle), and more). See [Authenticating a user with multiple user provider](user_authentication.md#authenticate-user-with-multiple-user-providers) for more information. ## JWT authentication -To use [JWT authentication](https://jwt.io/) with [[= product_name =]], in the provided `config/packages/lexik_jwt_authentication.yaml` file, -modify the existing configuration by setting `authorization_header` to `enabled`: +To use [JWT authentication](https://jwt.io/) with [[= product_name =]], in the provided `config/packages/lexik_jwt_authentication.yaml` file, modify the existing configuration by setting `authorization_header` to `enabled`: ``` yaml hl_lines="8" lexik_jwt_authentication: diff --git a/docs/infrastructure_and_maintenance/security/reporting_issues.md b/docs/infrastructure_and_maintenance/security/reporting_issues.md index e20407e329..09adeeab46 100644 --- a/docs/infrastructure_and_maintenance/security/reporting_issues.md +++ b/docs/infrastructure_and_maintenance/security/reporting_issues.md @@ -4,7 +4,7 @@ description: Learn how to report security issues in Ibexa DXP. # Reporting security issues in Ibexa products -The security of [[= product_name_base =]] software is a primary concern and we take it seriously. +The security of [[= product_name_base =]] software is a primary concern and is taken seriously. For more information on security in [[= product_name_base =]] products, see [Ibexa Security Policy](https://www.ibexa.co/software-information/security). @@ -26,7 +26,8 @@ Please be verbose when reporting issues. The issue is solved faster if you inclu ## Dialogue -The engineering team may need your help to clarify certain specifics, so please respond to such inquiries. We keep you updated about the progress on our end. +The engineering team may need your help to clarify certain specifics, so please respond to such inquiries. +We keep you updated about the progress on our end. ## Responsible disclosure @@ -34,4 +35,5 @@ Please give the engineering team time to produce and distribute a solution befor ## Attribution -If you want, we can include your name and/or the name of your organisation, a link, and short description about you in the security notification we send out with the fix. Thank you! +If you want, we can include your name and/or the name of your organisation, a link, and short description about you in the security notification we send out with the fix. +Thank you! diff --git a/docs/infrastructure_and_maintenance/security/security_checklist.md b/docs/infrastructure_and_maintenance/security/security_checklist.md index 21d1f8a7b1..ca5c95c569 100644 --- a/docs/infrastructure_and_maintenance/security/security_checklist.md +++ b/docs/infrastructure_and_maintenance/security/security_checklist.md @@ -4,15 +4,12 @@ description: Ensure that your Ibexa DXP installation is secure by following our # Security checklist -When getting ready to go live with your project for the first time, or when re-launching it, -make sure that your setup is secure. +When getting ready to go live with your project for the first time, or when re-launching it, make sure that your setup is secure. !!! caution - Security is an ongoing process. After going live, you should pay attention to security advisories - released via [your service portal](https://support.ibexa.co/), - or via [Security advisories](https://developers.ibexa.co/security-advisories) if you're not a subscriber. - + Security is an ongoing process. After going live, you should pay attention to security advisories released via [your service portal](https://support.ibexa.co/), or via [Security advisories](https://developers.ibexa.co/security-advisories) if you're not a subscriber. + ## Symfony ### `APP_SECRET` @@ -24,11 +21,11 @@ make sure that your setup is secure. - The secret must be long enough. 32 characters is minimum, longer is better. !!! tip - + The following command generates a 64-character-long secure random value: - + `php -r "print bin2hex(random_bytes(32));"` - + !!! note On [[= product_name_cloud =]], if `APP_SECRET` isn't set, the system sets it to [`PLATFORM_PROJECT_ENTROPY`](https://docs.platform.sh/guides/symfony/environment-variables.html#symfony-environment-variables) @@ -37,7 +34,7 @@ make sure that your setup is secure. Only expose Symfony production mode openly on the internet. Don't expose the dev mode on the internet, otherwise you may disclose things like `phpinfo` and environment variables. -Exposing the dev mode exposes things like `phpinfo`, environment variables and so on. +Exposing the dev mode exposes things like `phpinfo`, environment variables, and more. For more information about securing Symfony-based systems, see [Authentication and authorisation]([[= symfony_doc =]]/security.html), [more on this subject]([[= symfony_doc =]]/security.html#learn-more), and Symfony's [secrets management system]([[= symfony_doc =]]/configuration/secrets.html). @@ -49,8 +46,7 @@ PHP 7.4 introduced the `zend.exception_ignore_args` setting in `php.ini`. The default value is 0 (disabled) for backwards compatibility. On production sites this should be set to 1 (enabled), to ensure stack traces don't include arguments passed to functions. Such arguments could include passwords or other sensitive information. -You should also make sure no stack trace is ever visible to end users of production sites, -though visible arguments are unsafe even if the stack traces only show up in log files. +You should also make sure no stack trace is ever visible to end users of production sites, though visible arguments are unsafe even if the stack traces only show up in log files. ### Disable error output from PHP @@ -68,23 +64,21 @@ display_startup_errors = Off ### Other PHP settings Consider what other security related settings are relevant for your needs. -The [OWASP PHP Configuration Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/PHP_Configuration_Cheat_Sheet.html) -contains several recommendations, but be aware that they may be out of date as they don't mention PHP 8. -See also [PHP's own security manual](https://www.php.net/manual/en/security.php). +The [OWASP PHP Configuration Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/PHP_Configuration_Cheat_Sheet.html) contains several recommendations, but be aware that they may be out of date as they don't mention PHP 8. + +For more information, see [PHP's own security manual](https://www.php.net/manual/en/security.php). ## [[= product_name =]] ### Fully-vetted admin users -Make sure Admin users and other privileged users who have access to System Information and setup in the back end -are vetted and fully trustworthy. +Make sure Admin users and other privileged users who have access to System Information and setup in the back end are vetted and fully trustworthy. -As administrator you have access to full information about the system through the `setup/system_info` policy, -and also to user data, Role editing, and many other critical aspects. +As administrator you have access to full information about the system through the `setup/system_info` policy, and also to user data, role editing, and many other critical aspects. ### Strong passwords -Enforce strong passwords for all users. +Enforce strong passwords for all users. This is specially important for admin accounts and other privileged users. - Never go online with admin password set to `publish` or any other default value. @@ -98,25 +92,28 @@ This is specially important for admin accounts and other privileged users. ### Secure secrets -Ensure all other secrets are similarly secured: Varnish invalidate token, JWT passphrase (if in use), -and any other application-specific secrets. +Ensure all other secrets are similarly secured: Varnish invalidate token, JWT passphrase (if in use), and any other application-specific secrets. ### Protect against brute force attacks -Consider introducing a measure against brute force login attacks, like CAPTCHA. Adjust timeout limits to your needs: +Consider introducing a measure against brute force login attacks, like CAPTCHA. +Adjust timeout limits to your needs: -When using the "forgot password" feature, a token is created which expires if the user doesn't click the password reset -link that gets mailed to them in time. The time before it expires is set in the parameter -`ibexa.site_access.config.default.security.token_interval_spec`. By nature this feature must be available to users -before they have logged in, including would-be attackers. If an attacker uses this feature with someone else's email -address, the attacker doesn't receive the email. But they could still try to guess the password reset link. That's why -this interval should be as short as possible. 5 minutes is often enough. +When using the "forgot password" feature, a token is created which expires if the user doesn't click the password reset link that gets mailed to them in time. +The time before it expires is set in the parameter `ibexa.site_access.config.default.security.token_interval_spec`. +By nature this feature must be available to users before they have logged in, including would-be attackers. +If an attacker uses this feature with someone else's email address, the attacker doesn't receive the email. +But they could still try to guess the password reset link. +That's why this interval should be as short as possible. +5 minutes is often enough. [[= product_name =]] allows you to create and send invitations to create an account in the frontend as a customer, the back office -as an employee, or the Corporate Portal as a business partner. You can send invitations to individual users or in -bulk. These invitations time out according to the parameter -`ibexa.site_access.config.default.user_invitation.hash_expiration_time`. This can safely be longer than the "forgot password" time, -since attackers cannot generate invitations. Don't leave it longer than it needs to be, though. +as an employee, or the Corporate Portal as a business partner. +You can send invitations to individual users or in bulk. +These invitations time out according to the parameter +`ibexa.site_access.config.default.user_invitation.hash_expiration_time`. +This can safely be longer than the "forgot password" time, since attackers cannot generate invitations. +Don't leave it longer than it needs to be, though. These timeouts are both entered as [PHP DateInterval duration strings](https://www.php.net/manual/en/dateinterval.construct.php). The forgot password feature defaults to "PT1H" (one hour). @@ -130,7 +127,8 @@ See [Security advisory: EZSA-2020-002](https://developers.ibexa.co/security-advi ### Block upload of unwanted file types The `ibexa.site_access.config.default.io.file_storage.file_type_blacklist` setting is defined in the config file `src/bundle/Core/Resources/config/default_settings.yml` in the Core bundle. -It prevents uploading files that might be executed on the server, a Remote Code Execution (RCE) vulnerability. The setting lists filename extensions for files that shouldn't be uploaded. +It prevents uploading files that might be executed on the server, a Remote Code Execution (RCE) vulnerability. +The setting lists filename extensions for files that shouldn't be uploaded. Attempting to upload files from the list results in an error message. There are also other safety measures in place, like using the web server configuration to block execution of uploaded scripts, see the next point. @@ -147,7 +145,8 @@ See the line below `# Disable .php(3) and other executable extensions in the var ### Use secure password hashing -Use the most secure supported password hashing method. This is currently `bcrypt`, and it's enabled by default. +Use the most secure supported password hashing method. +This is currently `bcrypt`, and it's enabled by default. ### Use UTF8MB4 with MySQL/MariaDB @@ -171,18 +170,19 @@ Use the following checklist to ensure the roles and policies are secure: ### Don't use "hide" for read access restriction The [visibility switcher](https://doc.ibexa.co/en/latest/content_management/locations/#location-visibility) is a convenient feature for withdrawing content from the frontend. -It acts as a filter in the frontend by default. You can choose to respect it or ignore it in your code. -It'sn't permission-based, and doesn't restrict read access to content. Hidden content can be read through other means, like the REST API or GraphQL. +It acts as a filter in the frontend by default. +You can choose to respect it or ignore it in your code. +It'sn't permission-based, and doesn't restrict read access to content. +Hidden content can be read through other means, like the REST API or GraphQL. -If you need to restrict read access to a given content item, you could create a role that grants read access for a given -[**Section**](https://doc.ibexa.co/en/latest/administration/content_organization/sections/) -or [**Object State**](https://doc.ibexa.co/en/latest/administration/content_organization/object_states/), -and set a different Section or Object State for the given Content. +If you need to restrict read access to a given content item, you could create a role that grants read access for a given [**Section**](https://doc.ibexa.co/en/latest/administration/content_organization/sections/) or [**Object State**](https://doc.ibexa.co/en/latest/administration/content_organization/object_states/), and set a different section or Object State for the given content. Or use other permission-based [**Limitations**](https://doc.ibexa.co/en/latest/permissions/limitations/). ### Minimize exposure -Security should be a multi-layered exercise. It's wise to minimize what features you make available to the world, even if there are no known or suspected vulnerabilities in those features, and even if your content is properly protected by roles and policies. Reduce your attack surface by exposing only what you must. +Security should be a multi-layered exercise. +It's wise to minimize what features you make available to the world, even if there are no known or suspected vulnerabilities in those features, and even if your content is properly protected by roles and policies. +Reduce your attack surface by exposing only what you must. - If possible, make the back office unavailable on the open internet. - [Symfony FOSJsRoutingBundle](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle) is required in those releases where it's included, to expose routes to JavaScript. It exposes only the required routes, nothing more. It's only required in the back office SiteAccess though, so you can consider blocking it in other SiteAccesses. You should also go through your own custom routes, and decide for each if you need to expose them or not. See the documentation on [YAML route definitions for exposure](https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/blob/master/Resources/doc/usage.rst#generating-uris). @@ -193,7 +193,8 @@ Security should be a multi-layered exercise. It's wise to minimize what features !!! tip "Access control" - One way to lock down an endpoint that should not be openly available is to restrict access to logged-in users, by using the [`access_control`]([[= symfony_doc =]]/security/access_control.html) feature. In your YAML configuration, under the `security` key, add an entry similar to the following one, which redirects requests to a login page: + One way to lock down an endpoint that should not be openly available is to restrict access to logged-in users, by using the [`access_control`]([[= symfony_doc =]]/security/access_control.html) feature. + In your YAML configuration, under the `security` key, add an entry similar to the following one, which redirects requests to a login page: ```yaml security: @@ -217,34 +218,34 @@ Those steps aren't needed when using [[= product_name_cloud =]], where the provi ### Security headers -There are a number of security related HTTP response headers that you can use to improve your security. -Headers must be adapted to the site in question, and in most cases it's site owner's responsibility. -The headers can be set either by the web server, or by a proxy like Varnish. +There are a number of security related HTTP response headers that you can use to improve your security. +Headers must be adapted to the site in question, and in most cases it's site owner's responsibility. +The headers can be set either by the web server, or by a proxy like Varnish. You can also set headers in PHP code by making a Symfony `RequestListener` for the `kernel.response` event and adding the header to the response object headers list. You most likely need to vary the security headers based on the SiteAccess in question and site implementation details, such as frontend code and libraries used. -- `Strict-Transport-Security` - ensures that all requests are sent over HTTPS, with no fallback to HTTP. -All production sites should use HTTPS and this header unless they have very particular needs. -This header is less important during development provided that the site is on an internal, protected network. -- `X-Frame-Options` - ensures that the site isn't embedded in a frame by a compliant browser. -Set the header to `SAMEORIGIN` to allow embedding by your own site, or `DENY` to block framing completely. -- `X-Content-Type-Options` - prevents the browser from second-guessing the mime-type of delivered content. -This header is less important if users cannot upload content and/or you trust your editors. However, it's safer to use it at all times. -Make sure that the `Content-Type` header is also correctly set, including for the top-level document, to avoid issues with HTML documents being downloaded while they should be rendered. -- `Content-Security-Policy` - blocks cross site scripting (XSS) attacks by setting an allowlist (whitelist) of resources to be loaded for a given page. -You can set separate lists for scripts, images, fonts, and so on. -For experimentation and testing, you can use `Content-Security-Policy-Report-Only` before activating the actual policy. -- `Referrer-Policy` - limits what information is sent from the previous page or site when navigating to a new page or site. -This header has several directives for fine-tuning the referrer information. -- `Permissions-Policy` - limits what features the browser can use, such as fullscreen, notifications, location, camera, or microphone. -For example, if someone succeeds in injecting their JavaScript into your site, this header prevents them from using those features to attack your users. +- `Strict-Transport-Security` - ensures that all requests are sent over HTTPS, with no fallback to HTTP. +All production sites should use HTTPS and this header unless they have particular needs. +This header is less important during development provided that the site is on an internal, protected network. +- `X-Frame-Options` - ensures that the site isn't embedded in a frame by a compliant browser. +Set the header to `SAMEORIGIN` to allow embedding by your own site, or `DENY` to block framing completely. +- `X-Content-Type-Options` - prevents the browser from second-guessing the mime-type of delivered content. +This header is less important if users cannot upload content and/or you trust your editors. However, it's safer to use it at all times. +Make sure that the `Content-Type` header is also correctly set, including for the top-level document, to avoid issues with HTML documents being downloaded while they should be rendered. +- `Content-Security-Policy` - blocks cross site scripting (XSS) attacks by setting an allowlist (whitelist) of resources to be loaded for a given page. +You can set separate lists for scripts, images, fonts, and more. +For experimentation and testing, you can use `Content-Security-Policy-Report-Only` before activating the actual policy. +- `Referrer-Policy` - limits what information is sent from the previous page or site when navigating to a new page or site. +This header has several directives for fine-tuning the referrer information. +- `Permissions-Policy` - limits what features the browser can use, such as fullscreen, notifications, location, camera, or microphone. +For example, if someone succeeds in injecting their JavaScript into your site, this header prevents them from using those features to attack your users. ### Track dependencies - Run servers on a recent operating system and install security patches for dependencies. - Configure servers to alert you about security updates from vendors. Pay special attention to dependencies used by your project directly, or by PHP. The provider of the operating system usually has a service for this. - Enable [GitHub Dependabot](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates) -to receive notifications when a security fix is released in a Github-hosted dependency. -- If you're not using Github for your project, you can create a dummy project on Github with the same dependencies as your real project, and enable Dependabot notifications for that. +to receive notifications when a security fix is released in a GitHub-hosted dependency. +- If you're not using GitHub for your project, you can create a dummy project on GitHub with the same dependencies as your real project, and enable Dependabot notifications for that. - Ensure you get notifications about security fixes in JavaScript dependencies. From e49efef52ea7ec174c67a6ff880ab6061244fcc0 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:18:41 +0200 Subject: [PATCH 41/77] Fixes in 'infrastructure' section --- docs/infrastructure_and_maintenance/backup.md | 12 ++++--- docs/infrastructure_and_maintenance/devops.md | 20 +++++++----- .../environments.md | 11 ++++--- .../performance.md | 12 +++---- .../request_lifecycle.md | 31 ++++++++++--------- .../sessions.md | 20 +++++------- .../support_and_maintenance_faq.md | 15 +++------ 7 files changed, 62 insertions(+), 59 deletions(-) diff --git a/docs/infrastructure_and_maintenance/backup.md b/docs/infrastructure_and_maintenance/backup.md index 79e0f16e5a..d28854d9b9 100644 --- a/docs/infrastructure_and_maintenance/backup.md +++ b/docs/infrastructure_and_maintenance/backup.md @@ -2,20 +2,22 @@ description: Periodically back up your Repository information by making a database backup. --- -# Backup +# Backup -You should always make sure that your solution is properly backed up. The following example shows you how to do this on a Linux-UNIX-based system. You should shut down the DXP if it's running before making a backup. +You should always make sure that your solution is properly backed up. +The following example shows you how to do this on a Linux-UNIX-based system. +You should shut down the DXP if it's running before making a backup. !!! note "Externally stored assets" If you store assets in any external service or localization, you should back them up before proceeding. 1\. Navigate into the [[= product_name =]] directory: - + ``` cd /path/to/ibexa ``` - + 2\. Clear all caches: ``` @@ -24,7 +26,7 @@ var/logs/* ``` 3\. Create a dump of the database: - + ``` # MySQL mysqldump -u --add-drop-table > db_backup.sql diff --git a/docs/infrastructure_and_maintenance/devops.md b/docs/infrastructure_and_maintenance/devops.md index 1dc63ea399..ef851697dc 100644 --- a/docs/infrastructure_and_maintenance/devops.md +++ b/docs/infrastructure_and_maintenance/devops.md @@ -8,7 +8,9 @@ description: See various tools that can help you debug your Ibexa DXP installati ### Clearing file cache using the Symfony cache:clear command -Symfony provides a command for clearing cache. It deletes all file-based caches, which mainly consist of a Twig template, a [service container](php_api.md#service-container), and the Symfony route cache, but also everything else stored in the cache folder. Out of the box on a single-server setup this includes Content cache.  +Symfony provides a command for clearing cache. +It deletes all file-based caches, which mainly consist of a Twig template, a [service container](php_api.md#service-container), and the Symfony route cache, but also everything else stored in the cache folder. +Out of the box on a single-server setup this includes Content cache.  For further information on the command's use, see its help text: @@ -18,7 +20,8 @@ php bin/console --env=prod cache:clear -h !!! note - If you don't specify an environment, by default `cache:clear` clears the cache for the `dev` environment. If you want to clear it for `prod` you need to use the `--env=prod` option. + If you don't specify an environment, by default `cache:clear` clears the cache for the `dev` environment. + If you want to clear it for `prod` you need to use the `--env=prod` option. !!! caution "Clustering" @@ -41,17 +44,20 @@ To install it, run the following command: composer require symfony/debug-pack ``` -After you have installed Symfony Web Debug Toolbar, it's available when running [[= product_name =]] in the `dev` environment. it's extended with some [[= product_name =]]-specific information: +After you have installed Symfony Web Debug Toolbar, it's available when running [[= product_name =]] in the `dev` environment. +It's extended with some [[= product_name =]]-specific information: ![Ibexa DXP info in Web Debug Toolbar](web_debug_toolbar.png "Ibexa DXP info in Web Debug Toolbar") #### SPI (persistence) -This section provides the number of non-cached SPI calls and handlers. You can see details of these calls in the [Symfony Profiler]([[= symfony_doc =]]/profiler.html) page. +This section provides the number of non-cached SPI calls and handlers. +You can see details of these calls in the [Symfony Profiler]([[= symfony_doc =]]/profiler.html) page. #### SiteAccess -Here you can see the name of the current SiteAccess and how it was matched. For reference see the [list of possible SiteAccess matchers](siteaccess_matching.md#available-siteaccess-matchers). +Here you can see the name of the current SiteAccess and how it was matched. +For reference see the [list of possible SiteAccess matchers](siteaccess_matching.md#available-siteaccess-matchers). ## Logging and debug configuration @@ -61,8 +67,8 @@ The other is the standard [PSR-3](https://github.com/php-fig/fig-standards/blob ### Debugging in dev environment -When using the Symfony `dev` [environment](environments.md), the system tracks additional metrics for you to be able to debug issues. They -include Symfony cache use, and a [persistence cache](persistence_cache.md#persistence-cache-configuration) use. +When using the Symfony `dev` [environment](environments.md), the system tracks additional metrics for you to be able to debug issues. +They include Symfony cache use, and a [persistence cache](persistence_cache.md#persistence-cache-configuration) use. #### Reducing memory use diff --git a/docs/infrastructure_and_maintenance/environments.md b/docs/infrastructure_and_maintenance/environments.md index 7753ee0d8f..17bb607dd7 100644 --- a/docs/infrastructure_and_maintenance/environments.md +++ b/docs/infrastructure_and_maintenance/environments.md @@ -4,16 +4,19 @@ description: In Ibexa DXP you can use environment provided by Symfony in virtual # Environments -Environment configuration is provided by Symfony. [[= product_name =]] additionally enables you to specify environments in virtual host configuration. -You can configure several environments, such as production, development, or staging. You can have different configuration sets for each of them. +Environment configuration is provided by Symfony. +[[= product_name =]] additionally enables you to specify environments in virtual host configuration. +You can configure several environments, such as production, development, or staging. +You can have different configuration sets for each of them. !!! tip See also [Environments in Symfony doc]([[= symfony_doc =]]/configuration.html#configuration-environments). - + ## Web server configuration -For example, using Apache, in the [`VirtualHost` example](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/apache2/vhost.template) in your installation, the required `VirtualHost` configurations have been already included. You can switch to the desired environment by setting the `ENVIRONMENT` variable to `prod`, `dev` or another custom value, like in the following example: +For example, using Apache, in the [`VirtualHost` example](https://raw.githubusercontent.com/ibexa/post-install/main/resources/templates/apache2/vhost.template) in your installation, the required `VirtualHost` configurations have been already included. +You can switch to the desired environment by setting the `ENVIRONMENT` variable to `prod`, `dev` or another custom value, like in the following example: ``` # Environment. diff --git a/docs/infrastructure_and_maintenance/performance.md b/docs/infrastructure_and_maintenance/performance.md index 0300ce4909..40bf170dc4 100644 --- a/docs/infrastructure_and_maintenance/performance.md +++ b/docs/infrastructure_and_maintenance/performance.md @@ -15,7 +15,7 @@ If you're in a hurry, the most important recommendations on this page are: - Dump optimized Composer autoload classmap - Use a full web (Nginx/Apache) server with vhost -- Avoid shared filesystems for code (Docker for Mac/Win, VirtualBox/*, Vagrant, etc.), or find ways to optimize or work around the issues. +- Avoid shared filesystems for code (Docker for Mac/Win, VirtualBox/*, Vagrant, and more), or find ways to optimize or work around the issues. - For clustering (mainly relevant for production/staging), reduce latency to Redis/Memcached, use Varnish and [Solr](solr_overview.md). ## Client @@ -44,7 +44,7 @@ In production setups: ### Web server -- Use Nginx/Apache even for development, as PHP's built-in web server (as exposed via Symfony's `server:*` commands) is only able to handle one request at a time (including JS/CSS/* asset loading, etc.). +- Use Nginx/Apache even for development, as PHP's built-in web server (as exposed via Symfony's `server:*` commands) is only able to handle one request at a time (including JS/CSS/* asset loading, and more). - Use a recent version of nginx, set up https, and enable http/2 to reduce connection latency on parallel requests. ### PHP @@ -116,9 +116,9 @@ To avoid quickly running out of memory while executing such commands you should !!! note "Memory still grows" - Even when everything is configured like described above, memory grows for each iteration - of indexing/inserting a content item with at least *1kb* per iteration after the initial first 100 rounds. - This is expected behavior; to be able to handle more iterations you have to do one or several of the following: + Even when everything is configured like described above, memory grows for each iteration of indexing/inserting a content item with at least *1kb* per iteration after the initial first 100 rounds. + This is expected behavior. + To be able to handle more iterations you have to do one or several of the following: - Change the import/index script in question to [use process forking](#process-forking-with-symfony) to avoid the issue. - Upgrade PHP: *newer versions of PHP are typically more memory-efficient.* @@ -127,7 +127,7 @@ To avoid quickly running out of memory while executing such commands you should ### Process forking with Symfony The recommended way to completely avoid "memory leaks" in PHP in the first place is to use processes. -For console scripts this is typically done using process forking which is quite easily achievable with Symfony. +For console scripts this is typically done using process forking which is achievable with Symfony. The things you need to do: diff --git a/docs/infrastructure_and_maintenance/request_lifecycle.md b/docs/infrastructure_and_maintenance/request_lifecycle.md index 1787425b2f..fffdce2bf3 100644 --- a/docs/infrastructure_and_maintenance/request_lifecycle.md +++ b/docs/infrastructure_and_maintenance/request_lifecycle.md @@ -11,7 +11,8 @@ When entering the server infrastructure, the HTTP request can be handled by seve For an overview of what happens on a reverse proxy like Varnish or Fastly, see [Context-aware HTTP cache / Request lifecycle](context_aware_cache.md#request-lifecycle). -When arriving at a web server, the request is filtered by Apache Virtual Host, Nginx Server Blocks or equivalent. There, requests of static resources are separated from requests to PHP interpreter. +When arriving at a web server, the request is filtered by Apache Virtual Host, Nginx Server Blocks, or equivalent. +There, requests of static resources are separated from requests to PHP interpreter. As [[= product_name =]] is a Symfony application, the handling of requests starts like in Symfony (see [Symfony and HTTP Fundamentals](https://symfony.com/doc/current/introduction/http_fundamentals.html)). @@ -19,7 +20,8 @@ If the HTTP request is to be treated by [[= product_name =]], it goes to the `pu The front controller transforms the HTTP request into a PHP [`Request` object](https://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-request-object) and passes it to Symfony's Kernel to get a [`Response` object](https://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-response-object) that is transformed and sent back as an HTTP response. -The schemas start with a regular `Request` object from a browser that enters Symfony and [[= product_name =]]. There is no ESI, no REST, and no GraphQL request performed. +The schemas start with a regular `Request` object from a browser that enters Symfony and [[= product_name =]]. +There is no ESI, no REST, and no GraphQL request performed. ## Lifecycle flowcharts @@ -41,19 +43,19 @@ This schema is described below event by event. !!! tip To list all listeners that listen to an event, run `php bin/console debug:event-dispatcher `, for example: - + ```bash php bin/console debug:event-dispatcher kernel.request ``` - + To view details of a service (including class, arguments and tags), run `php bin/console debug:container --show-arguments `, for example: - + ```bash php bin/console debug:container --show-arguments ibexa.siteaccess_match_listener` ``` - + To list all services with a specific tag, run `php bin/console debug:container --tag=`, for example: - + ```bash php bin/console debug:container --tag=router ``` @@ -79,13 +81,11 @@ The `ibexa.siteaccess_match_listener` service: - then dispatches the `Ibexa\Core\MVC\Symfony\SiteAccess` event (`MVCEvents::SITEACCESS`). The `SiteAccessListener` (`Ibexa\Bundle\Core\EventListener\SiteAccessListener`) subscribes to this `Ibexa\Core\MVC\Symfony\SiteAccess` event with top priority (priority 255). -The `SiteAccessListener` adds the **`semanticPathinfo`** attribute, the path without SiteAccess indications ([`URIElement`](siteaccess_matching.md#urielement), [`URIText`](siteaccess_matching.md#uritext), -or [`Map\URI`](siteaccess_matching.md#mapuri) implementing the `URILexer` interface) to the request. +The `SiteAccessListener` adds the **`semanticPathinfo`** attribute, the path without SiteAccess indications ([`URIElement`](siteaccess_matching.md#urielement), [`URIText`](siteaccess_matching.md#uritext), or [`Map\URI`](siteaccess_matching.md#mapuri) implementing the `URILexer` interface) to the request. ### Routing -Finally, the `Symfony\Component\HttpKernel\EventListener\RouterListener` (`router_listener`) (priority 32), which also listens to the `kernel.request` event, -calls `Ibexa\Core\MVC\Symfony\Routing\ChainRouter::matchRequest` and adds its returned parameters to the request. +Finally, the `Symfony\Component\HttpKernel\EventListener\RouterListener` (`router_listener`) (priority 32), which also listens to the `kernel.request` event, calls `Ibexa\Core\MVC\Symfony\Routing\ChainRouter::matchRequest` and adds its returned parameters to the request. #### `ChainRouter` @@ -109,7 +109,7 @@ If a wildcard matches, the request's `semanticPathinfo` is updated and the route ### `UrlAliasRouter` `UrlAliasRouter` (`Ibexa\Bundle\Core\Routing\UrlAliasRouter`): -This router uses the `UrlAliasService` to associate the `semanticPathinfo` to a Location. +This router uses the `UrlAliasService` to associate the `semanticPathinfo` to a location. If it finds a Location, the request receives the attributes **`locationId`** and **`contentId`**, **`viewType`** is set to `full`, and the **`_controller`** is set to `ibexa_content:viewAction` for now. The `locale_listener` (priority 16) sets the request's **`_locale`** attribute. @@ -153,7 +153,8 @@ The `HttpKernel` then dispatches a `kernel.controller_arguments` (`KernelEvents: ## Controller execution -The `HttpKernel` extracts from the request the controller and the arguments to pass to the controller. [Argument resolvers](https://symfony.com/doc/5.4/controller/argument_value_resolver.html) work in a way similar to autowiring. +The `HttpKernel` extracts from the request the controller and the arguments to pass to the controller. +[Argument resolvers](https://symfony.com/doc/5.4/controller/argument_value_resolver.html) work in a way similar to autowiring. The `HttpKernel` executes the controller with those arguments. As a reminder, the controller and its argument can be: @@ -233,4 +234,6 @@ The `HttpKernel` retrieves the response attached to the event and continues. ## End of HTTP response -The web server outputs the HTTP response. Depending on the architecture, few things may still occur. For example, Varnish or Fastly can take specific headers into account when setting the cache or serving it. +The web server outputs the HTTP response. +Depending on the architecture, few things may still occur. +For example, Varnish or Fastly can take specific headers into account when setting the cache or serving it. diff --git a/docs/infrastructure_and_maintenance/sessions.md b/docs/infrastructure_and_maintenance/sessions.md index df25a9d677..31285cd5d6 100644 --- a/docs/infrastructure_and_maintenance/sessions.md +++ b/docs/infrastructure_and_maintenance/sessions.md @@ -9,13 +9,11 @@ It's further enhanced in [[= product_name =]] with support for SiteAccess-aware !!! note - Use of Memcached, Redis (or experimentally PDO) as session handler is a requirement in a cluster setup, - for details [see below](#cluster-setup). For an overview of the clustering feature see [Clustering](clustering.md). + Use of Memcached, Redis (or experimentally PDO) as session handler is a requirement in a cluster setup, for details [see below](#cluster-setup). For an overview of the clustering feature see [Clustering](clustering.md). ## Configuration -Symfony offers the possibility to change many session options at application level -(for example, in Symfony [`framework` configuration]([[= symfony_doc =]]/reference/configuration/framework.html#session)). +Symfony offers the possibility to change many session options at application level (for example, in Symfony [`framework` configuration]([[= symfony_doc =]]/reference/configuration/framework.html#session)). These options include: - `cookie_domain` @@ -24,13 +22,11 @@ These options include: - `cookie_secure` - `cookie_httponly` -However, in [[= product_name =]] you can set up several sites within one Symfony application, -so you can also define session configuration per SiteAccess and SiteAccess group level. +However, in [[= product_name =]] you can set up several sites within one Symfony application, so you can also define session configuration per SiteAccess and SiteAccess group level. ### Session options per SiteAccess -All site-related session configuration can be defined per SiteAccess and SiteAccess group -under the `ibexa.system..session` [configuration key](configuration.md#configuration-files): +All site-related session configuration can be defined per SiteAccess and SiteAccess group under the `ibexa.system..session` [configuration key](configuration.md#configuration-files): ``` yaml ibexa: @@ -53,7 +49,7 @@ ibexa: ## Session handlers In Symfony, a session handler is configured using `framework.session.handler_id`. -Symfony can be configured to use custom handlers, or just fall back to what is configured in PHP by setting it to null (`~`). +Symfony can be configured to use custom handlers, or fall back to what is configured in PHP by setting it to null (`~`). ### Default configuration @@ -102,8 +98,7 @@ Alternatively if you need to configure Memcached servers dynamically: - Set `%ibexa.session.handler_id%` (or `SESSION_HANDLER_ID` env var) to `app.session.handler.native_memcached` - Set `%ibexa.session.save_path%` (or `SESSION_SAVE_PATH` env var) to [`save_path` config for Memcached](https://www.php.net/manual/en/memcached.sessions.php) -Optionally tweak [`php-memcached` session settings](https://www.php.net/manual/en/memcached.configuration.php) for things like -session locking. +Optionally tweak [`php-memcached` session settings](https://www.php.net/manual/en/memcached.configuration.php) for things like session locking. ##### Handling sessions with Redis @@ -133,8 +128,7 @@ If you want to make sure sessions survive Redis or server restarts, consider usi ##### Alternative storing sessions in database using PDO -For setups where database is preferred for storing sessions, you may use Symfony's PdoSessionHandler, -although it's not currently recommended from performance perspective. +For setups where database is preferred for storing sessions, you may use Symfony's PdoSessionHandler, although it's not currently recommended from performance perspective. Below is a configuration example for [[= product_name =]]. Refer to the [Symfony Cookbook]([[= symfony_doc =]]/doctrine/pdo_session_storage.html) for full documentation. diff --git a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md index e1f3bce162..c64b158e55 100644 --- a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md +++ b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md @@ -17,13 +17,11 @@ composer show ibexa/* Besides that, all the configuration from the `config` directory may be helpful. -You should also list the steps to reproduce the issue, -or at least provide a clear description of the circumstances under which the problem occurred. +You should also list the steps to reproduce the issue, or at least provide a clear description of the circumstances under which the problem occurred. If you stumble upon a database-related problem, providing corresponding logs is also an important step. -Additionally, mention recent changes, performed migrations or external scripts/code customizations -related to the code which generates the problem. +Additionally, mention recent changes, performed migrations or external scripts/code customizations related to the code which generates the problem. #### What are the recommended ways to increase my project's performance? @@ -33,7 +31,7 @@ The most important clues around increasing overall performance of your [[= produ The language of the back office is based on the browser language. To change it you should install the proper package for your language (see [language packages list](https://github.com/ezplatform-i18n)). -Once you have language packages installed, you can switch the language of the back office in the User Settings menu. +Once you have language packages installed, you can switch the language of the back office in the **User Settings** menu. If you don't have a language defined in the browser, it's selected based on the `parameters.locale_fallback` parameter located in `config/packages/ibexa.yaml`. @@ -51,12 +49,9 @@ As an alternative to manually applying the patch, you can use [composer-patches] You can apply patches received from the Support, community or the others by using your `composer.json` file. For checking the versions you're on, refer to your `composer.lock`. All you need is to specify which package receives patches and give the path/URL to the actual file. -This should be done inside the `extra` section. Packages which should receive patches -are removed during `composer update` or `composer require` so they can be re-installed and re-patched. +This should be done inside the `extra` section. Packages which should receive patches are removed during `composer update` or `composer require` so they can be re-installed and re-patched. -When updating to the release that already contains specified patches, -Composer throws an error alongside a message that they cannot be applied and are skipped -([this is configurable with 1.x](https://github.com/cweagans/composer-patches/tree/1.x#error-handling)). +When updating to the release that already contains specified patches, Composer throws an error alongside a message that they cannot be applied and are skipped ([this is configurable with 1.x](https://github.com/cweagans/composer-patches/tree/1.x#error-handling)). They can be manually removed from `composer.json` now. #### How to clear the cache properly? From d7460c907069e9c64ef617151f66ec05f825a9ef Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:22:22 +0200 Subject: [PATCH 42/77] Fixes in 'languages' --- .../languages/back_office_translations.md | 17 +++--- docs/multisite/languages/language_api.md | 3 +- docs/multisite/languages/languages.md | 55 +++++++++++++------ 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/docs/multisite/languages/back_office_translations.md b/docs/multisite/languages/back_office_translations.md index 4f6072d1a9..8b1597f874 100644 --- a/docs/multisite/languages/back_office_translations.md +++ b/docs/multisite/languages/back_office_translations.md @@ -6,7 +6,8 @@ description: The language of the back office is selected automatically based on ## Enabling back office languages -All translations are available as a part of [[= product_name =]]. To enable back office translations, use the following configuration: +All translations are available as a part of [[= product_name =]]. +To enable back office translations, use the following configuration: ``` yaml ibexa: @@ -25,7 +26,7 @@ If your browser language is set to French, the back office is displayed in Frenc !!! tip You can also manually add the necessary .xliff files to an existing project. - + Add the language to an array under `ibexa.system..user_preferences.additional_translations`, for example: `ibexa.system..user_preferences.additional_translations: ['pl_PL', 'fr_FR']` @@ -38,21 +39,17 @@ To learn how to contribute to a translation, see [Contributing translations](con ### Selecting back office language -Once you have language packages enabled, you can switch the language of the back office -in the User Settings menu. +Once you have language packages enabled, you can switch the language of the back office in the **User Settings** menu. Otherwise, the language is selected based on the browser language. -If you don't have a language defined in the browser, the language is selected -based on `parameters.locale_fallback` in `config/packages/ibexa.yaml`. +If you don't have a language defined in the browser, the language is selected based on `parameters.locale_fallback` in `config/packages/ibexa.yaml`. ## Custom string translations When you extend the back office you often need to provide labels for new elements. -It's good practice to provide your labels in translations files, instead of literally, -so they can be reused and translated into other languages. +It's good practice to provide your labels in translations files, instead of literally, so they can be reused and translated into other languages. -To provide label strings, make use of the `Symfony\Component\Translation\TranslatorInterface` -and its `trans()` method. +To provide label strings, make use of the `Symfony\Component\Translation\TranslatorInterface` and its `trans()` method. The method takes as arguments: diff --git a/docs/multisite/languages/language_api.md b/docs/multisite/languages/language_api.md index 2e3d783b2d..bd596cacfd 100644 --- a/docs/multisite/languages/language_api.md +++ b/docs/multisite/languages/language_api.md @@ -16,8 +16,7 @@ To get a list of all languages in the system use [`LanguageService::loadLanguage ## Creating a language -To create a new language, you need to create a [`LanguageCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LanguageCreateStruct.html) -and provide it with the language code and language name. +To create a new language, you need to create a [`LanguageCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LanguageCreateStruct.html) and provide it with the language code and language name. Then, use [`LanguageService::createLanguage`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LanguageService.html#method_createLanguage) and pass the `LanguageCreateStruct` to it: ``` php diff --git a/docs/multisite/languages/languages.md b/docs/multisite/languages/languages.md index d97340a193..ea55e57af1 100644 --- a/docs/multisite/languages/languages.md +++ b/docs/multisite/languages/languages.md @@ -9,47 +9,62 @@ description: You can create multiple language versions (translations) of content [[= product_name =]] offers the ability to create multiple language versions (translations) of a content item. Translations are created per version of the item, so each version of the content can have a different set of translations. -A version always has at least one translation which by default is the *initial/main* translation. Further versions can be added, but only for languages that have previously been [added to the global translation list](#adding-available-languages), that is a list of all languages available in the system. The maximum number of languages in the system is 62. +A version always has at least one translation which by default is the *initial/main* translation. +Further versions can be added, but only for languages that have previously been [added to the global translation list](#adding-available-languages), that is a list of all languages available in the system. +The maximum number of languages in the system is 62. -Different translations of the same content item can be edited separately. This means that different users can work on translations into different languages at the same time. +Different translations of the same content item can be edited separately. +This means that different users can work on translations into different languages at the same time. Each version, including a draft, contains all the existing translations. -However, even if work on a draft takes time and other translations are updated in the meantime, -publishing the draft doesn't overwrite later modifications. +However, even if work on a draft takes time and other translations are updated in the meantime, publishing the draft doesn't overwrite later modifications. ### Adding available languages -The multilanguage system operates based on a global translation list that contains all languages available in the installation. Languages can be [added to this list from the **Admin** panel](https://doc.ibexa.co/projects/userguide/en/latest/content_management/translate_content/) in the back office. After adding a language be sure to dump all assets to the file system: +The multilanguage system operates based on a global translation list that contains all languages available in the installation. +Languages can be [added to this list from the **Admin** panel](https://doc.ibexa.co/projects/userguide/en/latest/content_management/translate_content/) in the back office. +After adding a language be sure to dump all assets to the file system: ``` yarn encore # OR php bin/console ibexa:encore:compile ``` -**The new language must then be added to the [SiteAccess](multisite.md) configuration**. Once this is done, any user with proper permissions can create content item versions in these languages in the user interface. +**The new language must then be added to the [SiteAccess](multisite.md) configuration**. +Once this is done, any user with proper permissions can create content item versions in these languages in the user interface. ### Translatable and untranslatable fields -Language versions consist of translated values of the content item's fields. In the content type definition every field is set to be Translatable or not. +Language versions consist of translated values of the content item's fields. +In the content type definition every field is set to be Translatable or not. -[[= product_name =]] doesn't decide by itself which fields can be translated and which cannot. For some field values the need for a translation can be obvious, for example for the body of an article. In other cases, for instance images without text, integer numbers or e-mail addresses, translation is usually unnecessary. Despite that, [[= product_name =]] gives you the possibility to mark any field as translatable regardless of its field type. It's only your decision to exclude the translation possibility for those fields where it makes no sense. +[[= product_name =]] doesn't decide by itself which fields can be translated and which cannot. +For some field values the need for a translation can be obvious, for example for the body of an article. +In other cases, for instance images without text, integer numbers, or email addresses, translation is usually unnecessary. +Despite that, [[= product_name =]] gives you the possibility to mark any field as translatable regardless of its field type. +It's only your decision to exclude the translation possibility for those fields where it makes no sense. When a field isn't flagged as Translatable, its value is copied from the initial/main translation when a new language version is created. This copied value cannot be modified. When a field is Translatable, you have to enter its value in a new language version manually. -For example, let's say that you need to store information about marathon contestants and their results. You build a "contestant" content type using the following fields: name, photo, age, nationality, finish time. Allowing the translation of anything other than nationality would be pointless, since the values stored by the other fields are the same regardless of the language used to describe the contestant. In other words, the name, photo, age and finish time would be the same in, for example, both English and Norwegian. +For example, let's say that you need to store information about marathon contestants and their results. +You build a "contestant" content type using the following fields: name, photo, age, nationality, finish time. +Allowing the translation of anything other than nationality would be pointless, since the values stored by the other fields are the same regardless of the language used to describe the contestant. +In other words, the name, photo, age and finish time would be the same in, for example, both English and Norwegian. ### Access control -You can control whether a user or user group is able to translate content or not. You do this by adding a [Language limitation](limitation_reference.md#language-limitation) to policies that allow creating or editing content. This limitation enables you to define which role can work with which languages in the system. +You can control whether a user or user group is able to translate content or not. +You do this by adding a [Language limitation](limitation_reference.md#language-limitation) to policies that allow creating or editing content. +This limitation enables you to define which role can work with which languages in the system. For more information of the permissions system, see [Permissions](permissions.md). -In addition, you can also control the access to the global translation list by using the Content/Translations policy. This policy allows users to add and remove languages from the global translation list. +In addition, you can also control the access to the global translation list by using the `Content/Translations` policy. +This policy allows users to add and remove languages from the global translation list. ## Using SiteAccesses for handling translations -If you want to have completely separate versions of the website, each with content in its own language, -you can [use SiteAccesses](#using-siteaccesses-for-handling-translations). +If you want to have completely separate versions of the website, each with content in its own language, you can [use SiteAccesses](#using-siteaccesses-for-handling-translations). Depending on the URI used to access the website, a different site opens, with a language set in configuration settings. All content items are then displayed in this language. @@ -111,7 +126,8 @@ A locale *conversion map* example [can be found in `ibexa/core`, in `locale.yaml ### More complex translation setup -There are some cases where your SiteAccesses share settings (Repository, content settings, etc.), but you don't want all of them to share the same `translation_siteaccesses` setting. This can be for example the case when you use separate SiteAccesses for mobile versions of a website. +There are some cases where your SiteAccesses share settings (repository, content settings, etc.), but you don't want all of them to share the same `translation_siteaccesses` setting. +This can be for example the case when you use separate SiteAccesses for mobile versions of a website. The solution is defining new groups: @@ -171,15 +187,20 @@ ibexa: ### Using implicit *related SiteAccesses* -If the `translation_siteaccesses` setting isn't provided, implicit *related SiteAccesses* is used instead. SiteAccesses are considered *related* if they share: +If the `translation_siteaccesses` setting isn't provided, implicit *related SiteAccesses* is used instead. +SiteAccesses are considered *related* if they share: - The same repository - The same root `location_id` (see [Multisite](multisite.md)) ### Fallback languages and missing translations -When setting up SiteAccesses with different language versions, you can specify a list of preset languages for each SiteAccess. When this SiteAccess is used, the system goes through this list. If a content item is unavailable in the first (prioritized) language, it attempts to use the next language in the list, and so on. Thanks to this you can have a fallback in case of a lacking translation. +When setting up SiteAccesses with different language versions, you can specify a list of preset languages for each SiteAccess. +When this SiteAccess is used, the system goes through this list. +If a content item is unavailable in the first (prioritized) language, it attempts to use the next language in the list, and more. +Thanks to this you can have a fallback in case of a lacking translation. -You can also assign a Default content availability flag to content types (available in the **Admin** panel). When this flag is assigned, content items of this type are available even when they don't have a language version in any of the languages configured for the current SiteAccess. +You can also assign a Default content availability flag to content types (available in the **Admin** panel). +When this flag is assigned, content items of this type are available even when they don't have a language version in any of the languages configured for the current SiteAccess. If a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. From 806aff1f2eea0a188917ec8b21fc6897ba41452c Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Wed, 16 Oct 2024 15:28:08 +0200 Subject: [PATCH 43/77] Fixes in 'site factory and siteaccess' sections --- docs/multisite/site_factory/site_factory.md | 20 +++++------ .../site_factory_configuration.md | 35 +++++++++---------- .../siteaccess_aware_configuration.md | 35 +++++++------------ .../siteaccess/siteaccess_matching.md | 16 ++++----- 4 files changed, 44 insertions(+), 62 deletions(-) diff --git a/docs/multisite/site_factory/site_factory.md b/docs/multisite/site_factory/site_factory.md index 470b586786..84fe97184b 100644 --- a/docs/multisite/site_factory/site_factory.md +++ b/docs/multisite/site_factory/site_factory.md @@ -10,15 +10,13 @@ It enables you to configure new sites without editing [YAML-based SiteAccess con !!! note - A SiteAccess that you define for a site by following the [configuration](multisite_configuration.md) - is always treated with higher priority than a SiteAccess created by using the Site Factory. - For example, if you define a French site within a YAML file, - and then create a site that uses the `fr` path in Site Factory, matchers ignore the second site. + A SiteAccess that you define for a site by following the [configuration](multisite_configuration.md) is always treated with higher priority than a SiteAccess created by using the Site Factory. + For example, if you define a French site within a YAML file, and then create a site that uses the `fr` path in Site Factory, matchers ignore the second site. Site Factory is disabled by default after installation. If you plan to use Site Factory, you need to enable and configure it. -To enable or disable Site Factory, follow respectively: +To enable or disable Site Factory, follow: - [Enable Site Factory section](#enable-site-factory) - [Disable Site Factory section](#disable-site-factory) @@ -29,11 +27,11 @@ To enable Site Factory, set the `ibexa_site_factory.enabled` [configuration key] ### Configure designs -Next, configure Site Factory by adding empty SiteAccess groups. At least one empty group is required. +Next, configure Site Factory by adding empty SiteAccess groups. +At least one empty group is required. The number of empty SiteAccess groups must be equal to the number of templates that you want to have when you create the new site. -In this example, you add two SiteAccess groups (`example_site_factory_group_1` and `example_site_factory_group_2`) -that correspond to the two templates (`site1` and `site2`) that you add in the next step. +In this example, you add two SiteAccess groups (`example_site_factory_group_1` and `example_site_factory_group_2`) that correspond to the two templates (`site1` and `site2`) that you add in the next step. Add the groups under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files): @@ -144,7 +142,7 @@ Then, run `docker-compose up`: ```bash export COMPOSE_FILE="doc/docker/base-dev.yml:doc/docker/multihost.yml" docker-compose up -``` +``` Your sites should be now visible under: @@ -157,7 +155,7 @@ Your sites should be now visible under: ### Define site directory -You can adjust the place where the directory of the new site is created (Location with ID 2 by default). +You can adjust the place where the directory of the new site is created (location with ID 2 by default). To do it, go to configuration files and under the `ibexa.system..site_factory` [configuration key](configuration.md#configuration-files) add the following parameter: ``` yaml @@ -172,7 +170,7 @@ Now, all new directories are created under "[[= product_name =]]". ### Provide access -The Site Factory is set up, now you can provide sufficient permissions to the Users. +The Site Factory is set up, now you can provide sufficient permissions to the users. Set the below policies to allow users to: diff --git a/docs/multisite/site_factory/site_factory_configuration.md b/docs/multisite/site_factory/site_factory_configuration.md index 1784fbabf6..0000cb3733 100644 --- a/docs/multisite/site_factory/site_factory_configuration.md +++ b/docs/multisite/site_factory/site_factory_configuration.md @@ -5,15 +5,14 @@ edition: experience # Site Factory configuration -## Parent Location +## Parent location -When working with the [Site Factory](site_factory.md), you can define the parent -Location for a new site in the configuration. -Each new site is created in the designated Location. +When working with the [Site Factory](site_factory.md), you can define the parent location for a new site in the configuration. +Each new site is created in the designated location. -To define a parent Location, add a new configuration key to the site template definition. -Each template is assigned to its own Location. -This can be either a Location ID (for example, `62`), or a recommended remote Location ID (for example, `1548b8cd8dd4c6b5082e566615d45e91`). +To define a parent location, add a new configuration key to the site template definition. +Each template is assigned to its own location. +This can be either a location ID (for example, `62`), or a recommended remote location ID (for example, `1548b8cd8dd4c6b5082e566615d45e91`). Add the configuration key to your template under the `ibexa_site_factory` [configuration key](configuration.md#configuration-files): @@ -32,13 +31,13 @@ ibexa_site_factory: parent_location_remote_id: 1548b8cd8dd4c6b5082e566615d45e91 ``` -Now, you can see the path to the new site's parent Location under design selection. -If you have sufficient permissions, you can change the defined Location during site creation. -If the parent Location isn't defined, you have to choose it from Universal Discovery Widget. +Now, you can see the path to the new site's parent location under design selection. +If you have sufficient permissions, you can change the defined Llcation during site creation. +If the parent location isn't defined, you have to choose it from Universal Discovery Widget. ## Site skeletons -The Site skeleton enables you to copy an entire content structure of the site design to the defined Location. +The Site skeleton enables you to copy an entire content structure of the site design to the defined location. Site skeleton copying is a one-off operation, it only happens during the site creation process. After that, you cannot copy the Site skeleton again, for example in the edit view. @@ -49,7 +48,7 @@ Remember that one template can only have one Site skeleton. If the design doesn't have a defined Site skeleton, a directory of the new site is created in a standard Site Factory process. To define a Site skeleton, add the `site_skeleton_id` or `site_skeleton_remote_id` key to the site template definition. -This can be either a Location ID (for example, `5966`), or a remote Location ID (for example, `3bed95afb1f8126f06a3c464e461e1ae66`). +This can be either a location ID (for example, `5966`), or a remote location ID (for example, `3bed95afb1f8126f06a3c464e461e1ae66`). ``` yaml hl_lines="7 12" ibexa_site_factory: @@ -76,8 +75,7 @@ You can create many user group skeletons and associate them with many templates. One template can have many user group skeletons assigned. To create a user group skeleton, first go to **Admin** -> **Site skeletons** and add a user group to the list of available skeletons. -Then, review the detailed information of the newly created user group skeleton, -copy the Location ID or the Location remote ID, and add a configuration key to the site template definition: +Then, review the detailed information of the newly created user group skeleton, copy the location ID or the Location remote ID, and add a configuration key to the site template definition: ``` yaml ibexa_site_factory: @@ -89,19 +87,18 @@ ibexa_site_factory: ``` Manage the permissions associated to the user group skeleton by [assigning roles](https://doc.ibexa.co/projects/userguide/en/latest/site_organization/organizing_the_site/#managing-permissions). -Make sure that the roles that you assign to the user group skeleton don't contain Location-based limitations. +Make sure that the roles that you assign to the user group skeleton don't contain location-based limitations. User group skeletons cannot contain individual user content items either. User group skeletons are retained after deleting the site. ## Automatic update of roles -Role definitions can contain user/login policies with limitations that limit user access to certain sites. +Role definitions can contain user/login policies with limitations that limit user access to certain sites. To avoid the need to add the new SiteAccess to limitations for all roles, -you can decide that the roles you select are automatically updated when the site is created, updated or deleted. +you can decide that the roles you select are automatically updated when the site is created, updated, or deleted. -Under the `ibexa_site_factory` [configuration key](configuration.md#configuration-files), add a list of roles which should have access to the frontend -when a site is created in Site Factory, for example: +Under the `ibexa_site_factory` [configuration key](configuration.md#configuration-files), add a list of roles which should have access to the frontend when a site is created in Site Factory, for example: ``` yaml ibexa_site_factory: diff --git a/docs/multisite/siteaccess/siteaccess_aware_configuration.md b/docs/multisite/siteaccess/siteaccess_aware_configuration.md index bedf93ff5a..a49f721544 100644 --- a/docs/multisite/siteaccess/siteaccess_aware_configuration.md +++ b/docs/multisite/siteaccess/siteaccess_aware_configuration.md @@ -5,14 +5,13 @@ description: Make sure your custom development's configuration can be used with # SiteAccess-aware configuration The [Symfony Config component]([[= symfony_doc =]]/components/config.html) makes it possible to define semantic configuration, exposed to the end developer. -This configuration is validated by rules you define, for example, validating type (string, array, integer, boolean and so on). +This configuration is validated by rules you define, for example, validating type (string, array, integer, boolean, and more). Usually, after it's validated and processed, this semantic configuration is then mapped to internal *key/value* parameters stored in the service container. [[= product_name =]] uses this for its core configuration, but adds another configuration level, the SiteAccess. For each defined SiteAccess, you need to be able to use the same configuration tree to define SiteAccess-specific config. -These settings then need to be mapped to SiteAccess-aware internal parameters -that you can retrieve with the [ConfigResolver](dynamic_configuration.md#configresolver). +These settings then need to be mapped to SiteAccess-aware internal parameters that you can retrieve with the [ConfigResolver](dynamic_configuration.md#configresolver). For this, internal keys need to follow the format `..`. where: - `namespace` is specific to your app or bundle @@ -23,8 +22,7 @@ For more information about the ConfigResolver, namespaces and scopes, see [confi !!! tip "Repository-aware configuration" - If you need to use different settings per Repository, not per SiteAccess, - see [Repository-aware configuration](repository_configuration.md#repository-aware-configuration). + If you need to use different settings per Repository, not per SiteAccess, see [Repository-aware configuration](repository_configuration.md#repository-aware-configuration). The example below assumes you're using an `Acme\ExampleBundle`. Remember to register the bundle by adding it to `config/bundles.php`: @@ -35,9 +33,7 @@ Acme\ExampleBundle\AcmeExampleBundle::class => ['all' => true], ### Parsing semantic configuration -To parse semantic configuration, create a `Configuration` class which extends -`Ibexa\Bundle\Core\DependencyInjection\Configuration\SiteAccessAware\Configuration` -and then extend its `generateScopeBaseNode()` method: +To parse semantic configuration, create a `Configuration` class which extends `Ibexa\Bundle\Core\DependencyInjection\Configuration\SiteAccessAware\Configuration` and then extend its `generateScopeBaseNode()` method: ``` php hl_lines="17" mapConfigArray()`, -which you must call outside the closure (before or after), so that it's called only once. +but enrich them by appending new entries. +This is possible by using `$processor->mapConfigArray()`, which you must call outside the closure (before or after), so that it's called only once. ``` php $processor->mapConfigArray('custom_setting', $config); @@ -209,8 +205,7 @@ acme_example: language: javascript ``` -By calling `mapConfigArray()` you can get the following end configuration, -where keys defined for `custom_setting` in default/group/SiteAccess scopes are merged: +By calling `mapConfigArray()` you can get the following end configuration, where keys defined for `custom_setting` in default/group/SiteAccess scopes are merged: ``` yaml parameters: @@ -225,11 +220,9 @@ parameters: ##### Merging from second level In the example above, entries were merged in respect to the scope order of precedence. -However, because you defined the `os_types` key for `siteaccess1`, it completely overrode the default value, -because the merge process is done only at the first level. +However, because you defined the `os_types` key for `siteaccess1`, it completely overrode the default value, because the merge process is done only at the first level. -You can add another level by passing `ContextualizerInterface::MERGE_FROM_SECOND_LEVEL` -as the third argument to `$contextualizer->mapConfigArray()`: +You can add another level by passing `ContextualizerInterface::MERGE_FROM_SECOND_LEVEL` as the third argument to `$contextualizer->mapConfigArray()`: ``` php $contextualizer->mapConfigArray('custom_setting', $config, ContextualizerInterface::MERGE_FROM_SECOND_LEVEL); @@ -247,8 +240,8 @@ parameters: language: javascript ``` -There is also another option, `ContextualizerInterface::UNIQUE`, -that ensures the array setting has unique values. It only works on normal arrays, not hashes. +There is also another option, `ContextualizerInterface::UNIQUE`, that ensures the array setting has unique values. +It only works on normal arrays, not hashes. !!! note @@ -259,12 +252,10 @@ that ensures the array setting has unique values. It only works on normal arrays Instead of passing a callable to `$processor->mapConfig()`, you can pass an instance of `Ibexa\Bundle\Core\DependencyInjection\Configuration\SiteAccessAware\ConfigurationMapperInterface`. -This can be useful if you have a lot of configuration to map and don't want to pollute -your service container extension class (it's better for maintenance). +This can be useful if you have a lot of configuration to map and don't want to pollute your service container extension class (it's better for maintenance). #### Merging hash values between scopes You should not use `$contextualizer->mapConfigArray()` within the scope loop, like for simple values. When using a closure/callable, you usually call it before or after `$processor->mapConfig()`. -For mapper objects, you can use a dedicated interface: `HookableConfigurationMapperInterface`, -which defines two methods: `preMap()` and `postMap()`. +For mapper objects, you can use a dedicated interface: `HookableConfigurationMapperInterface`, which defines two methods: `preMap()` and `postMap()`. diff --git a/docs/multisite/siteaccess/siteaccess_matching.md b/docs/multisite/siteaccess/siteaccess_matching.md index 42d1019ae0..a6c32c2f2c 100644 --- a/docs/multisite/siteaccess/siteaccess_matching.md +++ b/docs/multisite/siteaccess/siteaccess_matching.md @@ -25,7 +25,8 @@ ibexa: `ibexa.siteaccess.match` can contain multiple matchers. -The first matcher succeeding always wins, so be careful when using catch-all matchers like `URIElement`. In the following example, `Compound\LogicalAnd` is placed before the `Map\Host` for `my.site/corporate` to be reachable: +The first matcher succeeding always wins, so be careful when using catch-all matchers like `URIElement`. +In the following example, `Compound\LogicalAnd` is placed before the `Map\Host` for `my.site/corporate` to be reachable: ```yaml ibexa: @@ -43,11 +44,9 @@ ibexa: my.site: mysite ``` -If the matcher class doesn't start with a backslash (`\`), it's relative to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher` -(for example, `Map\URI` refers to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI`) +If the matcher class doesn't start with a backslash (`\`), it's relative to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher` (for example, `Map\URI` refers to `Ibexa\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI`) -You can specify [custom matchers](#custom-matchers) by using a fully qualified class name (for example, `\My\SiteAccess\Matcher`) -or a service identifier (for example, `@my_matcher_service`). +You can specify [custom matchers](#custom-matchers) by using a fully qualified class name (for example, `\My\SiteAccess\Matcher`) or a service identifier (for example, `@my_matcher_service`). In the case of a fully qualified class name, the matching configuration is passed in the constructor. In the case of a service, it must implement `Ibexa\Bundle\Core\SiteAccess\Matcher`. The matching configuration is passed to `setMatchingConfiguration()`. @@ -150,8 +149,7 @@ Example host name `www.page.com` matches SiteAccess `event`. !!! note - If you encounter problems with the `Map\Host` matcher, make sure that your installation is - [properly configured to use token-based authentication](ez_platform_v2.4.md#update-ez-enterprise-v24-to-v242). + If you encounter problems with the `Map\Host` matcher, make sure that your installation is [properly configured to use token-based authentication](ez_platform_v2.4.md#update-ez-enterprise-v24-to-v242). ### `Map\URI` @@ -214,9 +212,7 @@ ibexa: '@App\Matcher\MySiteaccessMatcher': ~ ``` -The service must be tagged with `ibexa.site_access.matcher` -and must implement `Ibexa\Bundle\Core\SiteAccess\Matcher` -(and `Ibexa\Core\MVC\Symfony\SiteAccess\VersatileMatcher` if you want to use compound logical matchers). +The service must be tagged with `ibexa.site_access.matcher` and must implement `Ibexa\Bundle\Core\SiteAccess\Matcher` (and `Ibexa\Core\MVC\Symfony\SiteAccess\VersatileMatcher` if you want to use compound logical matchers). ## Combining SiteAccess matchers From 8c106c486f8c479391db1fa1f7c3237071670e91 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 17 Oct 2024 08:18:33 +0200 Subject: [PATCH 44/77] Fixes in 'multisite' --- docs/multisite/multisite_configuration.md | 26 +++++++------------ docs/multisite/set_up_campaign_siteaccess.md | 15 ++++------- .../set_up_translation_siteaccess.md | 8 +++--- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/docs/multisite/multisite_configuration.md b/docs/multisite/multisite_configuration.md index 24c16f7359..addae360f4 100644 --- a/docs/multisite/multisite_configuration.md +++ b/docs/multisite/multisite_configuration.md @@ -32,7 +32,7 @@ ibexa: event_group: [event] ``` -Groups are useful when you want to use common settings for several SiteAccesses and avoid duplicating configuration. +You can use groups when you want to use common settings for several SiteAccesses and avoid duplicating configuration. SiteAccess groups act like regular SiteAccesses as far as configuration is concerned. A SiteAccess can be part of several groups. SiteAccess configuration has always precedence over group configuration. @@ -42,9 +42,7 @@ The predefined `admin` SiteAccess in `admin_group` (configured in `config/packag Don't remove this group. If you need a multisite setup with multiple back offices, add any additional administration SiteAccesses to `admin_group`. -In cases where the sites are on separate databases, each needs its own [repository](repository_configuration.md) -(including their own storage and search connection), var dir, [cache pool](persistence_cache.md#persistence-cache-configuration), -and ideally also separate Varnish/Fastly configuration. +In cases where the sites are on separate databases, each needs its own [repository](repository_configuration.md) (including their own storage and search connection), var dir, [cache pool](persistence_cache.md#persistence-cache-configuration), and ideally also separate Varnish/Fastly configuration. !!! caution @@ -76,13 +74,11 @@ ibexa: ### SiteAccess name -To create a better editorial experience, you can replace the SiteAccess code in the back office -with a human-readable name of the website, for example `Company site` or `Summer Sale`. +To create a better editorial experience, you can replace the SiteAccess code in the back office with a human-readable name of the website, for example `Company site` or `Summer Sale`. You can also translate SiteAccess names. Displayed names depend on the current back office language. -To define translations or SiteAccess names, place them in YAML file with correct language code, -for example `translations/ibexa_siteaccess.en.yaml`: +To define translations or SiteAccess names, place them in YAML file with correct language code, for example `translations/ibexa_siteaccess.en.yaml`: ``` yaml en: Company site @@ -121,8 +117,7 @@ ibexa: ``` `global` and `default` scopes include the `admin` SiteAccess, which is responsible for the back office. -For example, the following configuration defines both the front template for articles -and the template used in the back office, unless you configure other templates for a specific SiteAccess or SiteAccess group: +For example, the following configuration defines both the front template for articles and the template used in the back office, unless you configure other templates for a specific SiteAccess or SiteAccess group: ``` yaml ibexa: @@ -166,14 +161,14 @@ ibexa: !!! caution "SiteAccess with separate admin domain" - If an admin SiteAccess in your installation uses a different domain than the front SiteAccesses, - be sure to use SSL (https protocol). + If an admin SiteAccess in your installation uses a different domain than the front SiteAccesses, be sure to use SSL (https protocol). Otherwise, you cannot preview content in Page Builder from the back office. #### SiteAccess switching in Page Builder If you need to change between SiteAccesses in Site mode, don't use any functions in the page itself (for example, a language switcher). -This may cause unexpected errors. Instead, switch between SiteAccesses using the SiteAccess bar above the page. +This may cause unexpected errors. +Instead, switch between SiteAccesses using the SiteAccess bar above the page. ## Location tree @@ -195,12 +190,11 @@ ibexa: - `location_id` defines the Location ID of the content root for the SiteAccess. - `excluded_uri_prefixes` defines which URIs ignore the root limit set using `location_id`. -In the example above, the Media and Images folders are accessible using their own URI, -even though they're outside the Location provided in `content.tree_root.location_id`. +In the example above, the Media and Images folders are accessible using their own URI, even though they're outside the Location provided in `content.tree_root.location_id`. - `index_page` is the page shown when you access the root index `/`. !!! note - + Prefixes aren't case sensitive. Leading slashes (`/`) are automatically trimmed internally, so they can be ignored. diff --git a/docs/multisite/set_up_campaign_siteaccess.md b/docs/multisite/set_up_campaign_siteaccess.md index 049f9ff175..e75a00d5ed 100644 --- a/docs/multisite/set_up_campaign_siteaccess.md +++ b/docs/multisite/set_up_campaign_siteaccess.md @@ -11,8 +11,7 @@ The `campaign` site uses a different part of the content tree than the main site ## Configure SiteAccesses -First, in SiteAccess configuration, add the `campaign` SiteAccess -to the list under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files): +First, in SiteAccess configuration, add the `campaign` SiteAccess to the list under the `ibexa.siteaccess` [configuration key](configuration.md#configuration-files): ``` yaml ibexa: @@ -27,8 +26,7 @@ ibexa: site: site ``` -The `match` setting ensures that when a visitor accesses the `/summer-sale` URI, -they see the `campaign` SiteAccess. +The `match` setting ensures that when a visitor accesses the `/summer-sale` URI, they see the `campaign` SiteAccess. ## Set root folder @@ -48,8 +46,7 @@ ibexa: location_id: 57 ``` -Thanks to this configuration, you can access `/campaign/Articles/Article2`, -but not `/campaign/General/Articles/Article1`. +Thanks to this configuration, you can access `/campaign/Articles/Article2`, but not `/campaign/General/Articles/Article1`. ## Reuse content @@ -66,8 +63,6 @@ ibexa: excluded_uri_prefixes: [ /media/images/logos ] ``` -Now, when you use the `campaign` SiteAccess, you can reach `/campaign/Media/Images/Logos`, -despite the fact that it's not a sub-item of the "Campaign" Location. +Now, when you use the `campaign` SiteAccess, you can reach `/campaign/Media/Images/Logos`, despite the fact that it's not a sub-item of the "Campaign" Location. -As a next step, you can configure different [designs](design_engine.md) -for the two SiteAccesses. +As a next step, you can configure different [designs](design_engine.md) for the two SiteAccesses. diff --git a/docs/multisite/set_up_translation_siteaccess.md b/docs/multisite/set_up_translation_siteaccess.md index e4a4931c72..ef471c792c 100644 --- a/docs/multisite/set_up_translation_siteaccess.md +++ b/docs/multisite/set_up_translation_siteaccess.md @@ -28,8 +28,7 @@ yarn encore Next, configure a new SiteAccess to match the newly-configured language. -The most typical setup for a site with translated content is to map the base of the domain to one language -and use the first segment of the URI to match to translations. +The most typical setup for a site with translated content is to map the base of the domain to one language and use the first segment of the URI to match to translations. For example: @@ -38,7 +37,7 @@ For example: To achieve this you need to create a new SiteAccess in configuration under the `ibexa.siteaccesses` [configuration key](configuration.md#configuration-files). Add the `fr` SiteAccess to list of all SiteAccesses and it to the common `site_group`. -This group is used for sharing settings such as API keys, cache locations and so on. +This group is used for sharing settings such as API keys, cache locations, and more. ``` yaml ibexa: @@ -79,5 +78,4 @@ As a next step, allow Anonymous users to read content on the new SiteAccesses: 1. Clear the cache by running: `php bin/console cache:clear`. You can now start translating content. -When you reload the site, access a translated content item through both SiteAccesses to see the difference, -for example: `/` and `/fr/`. +When you reload the site, access a translated content item through both SiteAccesses to see the difference, for example: `/` and `/fr/`. From 6baff1aa963a762ea2a88c50bc116f63499f38cd Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 17 Oct 2024 08:37:43 +0200 Subject: [PATCH 45/77] Fixes in 'permissions' section --- docs/permissions/custom_policies.md | 44 +++--- docs/permissions/limitation_reference.md | 97 +++++-------- docs/permissions/limitations.md | 12 +- docs/permissions/permission_overview.md | 17 ++- docs/permissions/permission_use_cases.md | 170 ++++++++++------------- docs/permissions/policies.md | 21 ++- 6 files changed, 151 insertions(+), 210 deletions(-) diff --git a/docs/permissions/custom_policies.md b/docs/permissions/custom_policies.md index 6f5b505413..fe98afe1e7 100644 --- a/docs/permissions/custom_policies.md +++ b/docs/permissions/custom_policies.md @@ -4,21 +4,21 @@ description: Create a custom policy to cover non-standard permission needs. # Custom policies -The content Repository uses [roles and policies](permissions.md) to give users access to different functions of the system. +The content repository uses [roles and policies](permissions.md) to give users access to different functions of the system. -Any bundle can expose available Policies via a `PolicyProvider` which can be added to IbexaCoreBundle's [service container](php_api.md#service-container) extension. +Any bundle can expose available policies via a `PolicyProvider` which can be added to IbexaCoreBundle's [service container](php_api.md#service-container) extension. ## PolicyProvider -A `PolicyProvider` object provides a hash containing declared modules, functions and Limitations. +A `PolicyProvider` object provides a hash containing declared modules, functions and limitations. - Each policy provider provides a collection of permission *modules*. - Each module can provide *functions* (for example, in `content/read`, "content" is the module, and "read" is the function) -- Each function can provide a collection of Limitations. +- Each function can provide a collection of limitations. -First level key is the module name which is limited to characters within the set `A-Za-z0-9_`, value is a hash of -available functions, with function name as key. Function value is an array of available Limitations, identified -by the alias declared in `LimitationType` service tag. If no Limitation is provided, value can be `null` or an empty array. +First level key is the module name which is limited to characters within the set `A-Za-z0-9_`, value is a hash of available functions, with function name as key. +Function value is an array of available limitations, identified by the alias declared in `LimitationType` service tag. +If no limitation is provided, value can be `null` or an empty array. ``` php [ @@ -34,7 +34,7 @@ by the alias declared in `LimitationType` service tag. If no Limitation is provi ``` Limitations need to be implemented as *Limitation types* and declared as services identified with `ibexa.permissions.limitation_type` tag. -Name provided in the hash for each Limitation is the same value set in the `alias` attribute in the service tag. +Name provided in the hash for each limitation is the same value set in the `alias` attribute in the service tag. For example: @@ -62,9 +62,7 @@ class MyPolicyProvider implements PolicyProviderInterface !!! note "Extend existing policies" - While a `PolicyProvider` may provide new functions to an existing policy module, - or additional Limitations to an existing function, - it's however strongly recommended to create your own modules. + While a `PolicyProvider` may provide new functions to an existing policy module, or additional limitations to an existing function, it's however strongly recommended to create your own modules. It's impossible to remove an existing module, function or limitation from a policy. @@ -143,7 +141,7 @@ For a `PolicyProvider` to be active, you have to register it in the `src/Kernel. [[= include_file('code_samples/back_office/limitation/src/Kernel.php') =]] ``` -## Custom Limitation type +## Custom limitation type For a custom module function, you can use existing limitation types or create custom ones. @@ -172,7 +170,7 @@ services: [[= include_file('code_samples/back_office/limitation/config/append_to_services.yaml', 1, 4) =]] ``` -### Custom Limitation type form +### Custom limitation type form #### Form mapper @@ -192,7 +190,7 @@ Provide a template corresponding to `getFormTemplate`. [[= include_file('code_samples/back_office/limitation/templates/themes/admin/limitation/custom_limitation_form.html.twig') =]] ``` -Next, register the service with the `ibexa.admin_ui.limitation.mapper.form` tag and set the `limitationType` attribute to the Limitation type's identifier: +Next, register the service with the `ibexa.admin_ui.limitation.mapper.form` tag and set the `limitationType` attribute to the limitation type's identifier: ``` yaml [[= include_file('code_samples/back_office/limitation/config/append_to_services.yaml', 5, 8) =]] @@ -200,32 +198,32 @@ Next, register the service with the `ibexa.admin_ui.limitation.mapper.form` tag #### Notable form mappers to extend -Some abstract Limitation type form mapper classes are provided to help implementing common complex Limitations. +Some abstract limitation type form mapper classes are provided to help implementing common complex limitations. -- `MultipleSelectionBasedMapper` is a mapper used to build forms for Limitations based on a checkbox list, where multiple items can be chosen. For example, it's used to build forms for [Content Type Limitation](limitation_reference.md#content-type-limitation), [Language Limitation](limitation_reference.md#language-limitation) or [Section Limitation](limitation_reference.md#section-limitation). -- `UDWBasedMapper` is used to build a Limitation form where a Content/Location must be selected. For example, it's used by the [Subtree Limitation](limitation_reference.md#subtree-limitation) form. +- `MultipleSelectionBasedMapper` is a mapper used to build forms for limitations based on a checkbox list, where multiple items can be chosen. For example, it's used to build forms for [Content Type Limitation](limitation_reference.md#content-type-limitation), [Language Limitation](limitation_reference.md#language-limitation) or [Section Limitation](limitation_reference.md#section-limitation). +- `UDWBasedMapper` is used to build a limitation form where a Content/Location must be selected. For example, it's used by the [Subtree Limitation](limitation_reference.md#subtree-limitation) form. #### Value mapper -By default, without a value mapper, the Limitation value is rendered by using the block `ez_limitation_value_fallback` of the template [`vendor/ibexa/admin-ui/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig`](https://github.com/ibexa/admin-ui/blob/4.5/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig#L1-L6). +By default, without a value mapper, the limitation value is rendered by using the block `ez_limitation_value_fallback` of the template [`vendor/ibexa/admin-ui/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig`](https://github.com/ibexa/admin-ui/blob/4.5/src/bundle/Resources/views/themes/admin/limitation/limitation_values.html.twig#L1-L6). -To customize the rendering, a value mapper eventually transforms the Limitation value and sends it to a custom template. +To customize the rendering, a value mapper eventually transforms the limitation value and sends it to a custom template. The value mapper implements [`Ibexa\AdminUi\Limitation\LimitationValueMapperInterface`](https://github.com/ibexa/admin-ui/blob/4.5/src/lib/Limitation/LimitationValueMapperInterface.php). -Its `mapLimitationValue` function returns the Limitation value transformed for the needs of the template. +Its `mapLimitationValue` function returns the limitation value transformed for the needs of the template. ``` php [[= include_file('code_samples/back_office/limitation/src/Security/Limitation/Mapper/CustomLimitationValueMapper.php') =]] ``` -Then register the service with the `ibexa.admin_ui.limitation.mapper.value` tag and set the `limitationType` attribute to Limitation type's identifier: +Then register the service with the `ibexa.admin_ui.limitation.mapper.value` tag and set the `limitationType` attribute to limitation type's identifier: ``` yaml [[= include_file('code_samples/back_office/limitation/config/append_to_services.yaml', 9, 12) =]] ``` -When a value mapper exists for a Limitation, the rendering uses a Twig block named `ez_limitation__value` where `` is the Limitation identifier in lower case. +When a value mapper exists for a limitation, the rendering uses a Twig block named `ez_limitation__value` where `` is the limitation identifier in lower case. In this example, block name is `ez_limitation_customlimitation_value` as the identifier is `CustomLimitation`. This template receives a `values` variable which is the return of the `mapLimitationValue` function from the corresponding value mapper. @@ -248,7 +246,7 @@ For example, `translations/ibexa_content_forms_policies.en.yaml`: [[= include_file('code_samples/back_office/limitation/translations/ibexa_content_forms_policies.en.yaml') =]] ``` -### Custom Limitation check +### Custom limitation check Check if current user has this custom limitation set to true from a custom controller: diff --git a/docs/permissions/limitation_reference.md b/docs/permissions/limitation_reference.md index 7f1a1718a9..c731bebd58 100644 --- a/docs/permissions/limitation_reference.md +++ b/docs/permissions/limitation_reference.md @@ -8,11 +8,9 @@ page_type: reference ## Blocking limitation A generic limitation type to use when no other limitation has been implemented. -Without any Limitation assigned, a `LimitationNotFoundException` is thrown. +Without any limitation assigned, a `LimitationNotFoundException` is thrown. -It's called "blocking" because it always informs the permissions system that -the user doesn't have access to any policy the limitation is assigned to, making -the permissions system move on to the next policy. +It's called "blocking" because it always informs the permissions system that the user doesn't have access to any policy the limitation is assigned to, making the permissions system move on to the next policy. ### Possible values @@ -37,7 +35,7 @@ Out of the box FunctionList uses it in the following way: ## ActivityLogOwner limitation -The `ActivityLogOwner` limitation specifies if a user can see only their own [recent activity](recent_activity.md) log entries, and not entries from other users. +The `ActivityLogOwner` limitation specifies if a user can see only their own [recent activity](recent_activity.md) log entries, and not entries from other users. | Value | UI value | Description | |-------|-----------------|--------------------------------------------------------------| @@ -66,8 +64,7 @@ The Change Owner (`ChangeOwner`) limitation specifies whether the user can chang ## Content type Group limitation -The content type Group (`UserGroup`) limitation specifies that only users with at least one common *direct* user -Group with the owner of content get the selected access right. +The Content Type Group (`UserGroup`) limitation specifies that only users with at least one common *direct* user Group with the owner of content get the selected access right. ### Possible values @@ -77,9 +74,7 @@ Group with the owner of content get the selected access right. ## Content type Group of Parent limitation -The content type Group of Parent (`ParentUserGroupLimitation`) limitation specifies that only Users with at least one common *direct* user group -with the owner of the parent Location of a content item get a certain access right, -used by `content/create` permission. +The Content Type Group of Parent (`ParentUserGroupLimitation`) limitation specifies that only Users with at least one common *direct* user group with the owner of the parent Location of a content item get a certain access right, used by `content/create` permission. ### Possible values @@ -89,8 +84,7 @@ used by `content/create` permission. ## Content type limitation -The Content Typ (`ContentType`) limitation specifies whether the user has access to content with a specific -content type. +The Content Type (`ContentType`) limitation specifies whether the user has access to content with a specific content type. ### Possible values @@ -100,13 +94,10 @@ content type. ## Content type of Parent limitation -The content type of Parent (`ParentContentType`) limitation specifies whether the user has access to content whose parent Location -contains a specific content type, used by `content/create`. +The Content Type of Parent (`ParentContentType`) limitation specifies whether the user has access to content whose parent location contains a specific content type, used by `content/create`. -This limitation combined with `ContentType` limitation allows you to define business -rules like allowing users to create "Blog Post" within a "Blog." -If you also combine it with `Owner of Parent` limitation, you effectively limit -access to create Blog Posts in the users' own Blogs. +This limitation combined with `ContentType` limitation allows you to define business rules like allowing users to create "Blog Post" within a "Blog." +If you also combine it with `Owner of Parent` limitation, you effectively limit access to create Blog Posts in the users' own Blogs. ### Possible values @@ -116,16 +107,15 @@ access to create Blog Posts in the users' own Blogs. ## Field Group limitation [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -A Field Group (`FieldGroup`) limitation specifies whether the user can work with content Fields belonging -to a specific group. -A user with this limitation is allowed to edit Fields belonging to the indicated group. -Otherwise, the Fields are inactive and filled with the default value (if set). +A Field Group (`FieldGroup`) limitation specifies whether the user can work with content fields belonging to a specific group. +A user with this limitation is allowed to edit fields belonging to the indicated group. +Otherwise, the fields are inactive and filled with the default value (if set). ### Possible values |Value|UI value|Description| |------|------|------| -|``|``|All valid Field group identifiers can be set as value(s)| +|``|``|All valid field group identifiers can be set as value(s)| ## Language limitation @@ -133,8 +123,7 @@ A Language (`Language`) limitation specifies whether the user has access to work A user with this limitation is allowed to: - - Create new content with the given translation(s) only. -This only applies to creating the first version of a content item. +- Create new content with the given translation(s) only. This only applies to creating the first version of a content item. - Edit content by adding a new translation or modifying an existing translation. - Publish content only when it results in adding or modifying an allowed translation. - Delete content only when it contains a translation into the specified language. @@ -147,21 +136,19 @@ This only applies to creating the first version of a content item. ## Location limitation -A Location (`Location`) limitation specifies whether the user has access to content with a specific -Location, in case of `content/create` the parent Location is evaluated. +A Location (`Location`) limitation specifies whether the user has access to content with a specific location, in case of `content/create` the parent location is evaluated. ### Possible values |Value|UI value|Description| |------|------|------| -|``|``|All valid Location IDs can be set as value(s)| +|``|``|All valid location IDs can be set as value(s)| ## New Section limitation -A New Section (`NewSection`) limitation specifies whether the user has access to assigning content to a given Section. +A New Section (`NewSection`) limitation specifies whether the user has access to assigning content to a given section. -In the `section/assign` policy you can combine this with Section limitation to -limit both from and to values. +In the `section/assign` policy you can combine this with section limitation to limit both from and to values. ### Possible values @@ -171,11 +158,9 @@ limit both from and to values. ## New State limitation -A New State (`NewObjectState`) limitation specifies whether the user has access to (assigning) a given Object -state to content. +A New State (`NewObjectState`) limitation specifies whether the user has access to (assigning) a given Object state to content. -In the `state/assign` policy you can combine this with State limitation to limit -both from and to values. +In the `state/assign` policy you can combine this with State limitation to limit both from and to values. ### Possible values @@ -185,8 +170,7 @@ both from and to values. ## Object State limitation -The Object State (`ObjectState`) limitation specifies whether the user has access to content with a specific -Object state. +The Object State (`ObjectState`) limitation specifies whether the user has access to content with a specific Object state. ### Possible values @@ -206,8 +190,7 @@ The Order Owner (`OrderOwner`) limitation specifies whether the user can modify ## Owner limitation -The Owner (`Owner`) limitation specifies that only the owner of the content item gets the selected -access right. +The Owner (`Owner`) limitation specifies that only the owner of the content item gets the selected access right. ### Possible values @@ -218,21 +201,18 @@ access right. ## Owner of Parent limitation -The Owner of Parent (`ParentOwner`) limitation specifies that only the users who own all parent Locations of -a content item get a certain access right, used for `content/create` permission. +The Owner of Parent (`ParentOwner`) limitation specifies that only the users who own all parent locations of a content item get a certain access right, used for `content/create` permission. ### Possible values |Value|UI value|Description| |------|------|------| -|`1`|"self"|Only the user who is the owner of all parent Locations gets access| +|`1`|"self"|Only the user who is the owner of all parent locations gets access| |`2`|"session"|Deprecated and works exactly like "self" in public PHP API since it has no knowledge of user Sessions| ## Parent Depth limitation -The Parent Depth (`ParentDepth`) limitation specifies whether the user has access to creating content under -a parent Location within a specific depth of the tree, used for `content/create` -permission. +The Parent Depth (`ParentDepth`) limitation specifies whether the user has access to creating content under a parent location within a specific depth of the tree, used for `content/create` permission. ### Possible values @@ -253,12 +233,11 @@ The Payment Owner (`PaymentOwner`) limitation specifies whether the user can mod ## Personalization access limitation -The Personalization limitation specifies the SiteAccesses for which the user can view or modify -the scenario configuration. +The Personalization limitation specifies the SiteAccesses for which the user can view or modify the scenario configuration. ## Product Type limitation -The Product Type (`ProductType`) limitation specifies whether the user has access to products belonging to a specific Product Type. +The Product Type (`ProductType`) limitation specifies whether the user has access to products belonging to a specific product type. ### Possible values @@ -268,8 +247,7 @@ The Product Type (`ProductType`) limitation specifies whether the user has acces ## Section limitation -The Section (`Section`) limitation specifies whether the user has access to content within a specific -Section. +The Section (`Section`) limitation specifies whether the user has access to content within a specific section. This limitation can be used as a role limitation. @@ -281,8 +259,7 @@ This limitation can be used as a role limitation. ## Segment group limitation [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -The segment group (`SegmentGroup`) limitation specifies whether the user has access segments within a specific -segment group. +The segment group (`SegmentGroup`) limitation specifies whether the user has access segments within a specific segment group. This limitation can be used as a role limitation. @@ -294,8 +271,7 @@ This limitation can be used as a role limitation. ## SiteAccess limitation -The SiteAccess (`SiteAccess`) limitation specifies to which SiteAccesses a certain permission applies, used -by `user/login`. +The SiteAccess (`SiteAccess`) limitation specifies to which SiteAccesses a certain permission applies, used by `user/login`. ### Possible values @@ -305,8 +281,7 @@ by `user/login`. ### Legacy compatibility notes -`SiteAccess` limitation is deprecated and isn't used actively in public PHP API, -but is allowed for being able to read / create limitations for legacy. +`SiteAccess` limitation is deprecated and isn't used actively in public PHP API, but is allowed for being able to read / create limitations for legacy. ## Shipment Owner limitation @@ -320,9 +295,7 @@ The Shipment Owner (`ShipmentOwner`) limitation specifies whether the user can m ## Subtree limitation -The Subtree (`Subtree`) limitation specifies whether the user has access to content within a specific -Subtree of Location, in case of `content/create` the parent Subtree of Location  -is evaluated. +The Subtree (`Subtree`) limitation specifies whether the user has access to content within a specific Subtree of location, in case of `content/create` the parent Subtree of location is evaluated. This limitation can be used as a role limitation. @@ -351,8 +324,7 @@ This limitation can be used as a role limitation. ## Workflow Stage limitation -The Workflow Stage (`WorkflowStage`) limitation specifies whether the user can edit content in a specific workflow -stage. +The Workflow Stage (`WorkflowStage`) limitation specifies whether the user can edit content in a specific workflow stage. ### Possible values @@ -360,8 +332,7 @@ The limitation takes as values stages configured for the workflow. ## Workflow Transition limitation -The Workflow Transition (`WorkflowTransition`) limitation specifies whether the user can move the content in a workflow through -a specific transition. +The Workflow Transition (`WorkflowTransition`) limitation specifies whether the user can move the content in a workflow through a specific transition. ### Possible values diff --git a/docs/permissions/limitations.md b/docs/permissions/limitations.md index a961883cc1..80ec9c0c92 100644 --- a/docs/permissions/limitations.md +++ b/docs/permissions/limitations.md @@ -7,24 +7,24 @@ page_type: reference Limitations are part of the permissions system. They limit the access granted to users by [Policies](permission_overview.md). -While a Policy grants the user access to a function, Limitations narrow it down by different criteria. +While a policy grants the user access to a function, Limitations narrow it down by different criteria. Limitations consist of two parts: - `Limitation` (Value) - `LimitationType` -Certain Limitations also serve as Role Limitations, which means they can be used to limit the rights of a Role assignment. -Currently, this covers [Subtree of Location](limitation_reference.md#subtree-limitation), [Section](limitation_reference.md#section-limitation) and [Personalization access](limitation_reference.md#personalization-access-limitation) Limitations. +Certain limitations also serve as role limitations, which means they can be used to limit the rights of a role assignment. +Currently, this covers [Subtree of Location](limitation_reference.md#subtree-limitation), [Section](limitation_reference.md#section-limitation) and [Personalization access](limitation_reference.md#personalization-access-limitation) limitations. `Limitation` represents the value, while `LimitationType` deals with the business logic surrounding how it actually works and is enforced. `LimitationTypes` have two modes of operation in regard to permission logic (see [`Ibexa\Contracts\Core\Limitation`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Limitation-Type.html) interface for more info): | Method | Use | |--------|-----| -| `evaluate` | Evaluates if the User has access to a given object in a certain context (for instance the context can be Locations when the object is `Content`), under the condition of the `Limitation` value(s). | -| `getCriterion` | Generates a `Criterion` using `Limitation` value and current User which `SearchService` by default applies to search criteria for filtering search based on permissions. | +| `evaluate` | Evaluates if the User has access to a given object in a certain context (for instance the context can be locations when the object is `Content`), under the condition of the `Limitation` value(s). | +| `getCriterion` | Generates a `Criterion` using `Limitation` value and current User which `SearchService` by default applies to Search Criteria for filtering search based on permissions. | ## Limitation reference -See [Limitation reference](limitation_reference.md) for detailed information about individual Limitations. +See [Limitation reference](limitation_reference.md) for detailed information about individual limitations. diff --git a/docs/permissions/permission_overview.md b/docs/permissions/permission_overview.md index 86ea5e003f..8149907b24 100644 --- a/docs/permissions/permission_overview.md +++ b/docs/permissions/permission_overview.md @@ -7,26 +7,29 @@ description: The permission system is based on policies that you assign to users A new user doesn't have permissions for any part of the system, unless they're explicitly given access. To get access they need to inherit roles, typically assigned to the user group they belong to. -Each role can contain one or more **Policies**. A policy is a rule that gives access to a single **function** in a **module**. -For example, a `section/assign` Policy allows the user to assign content to Sections. +Each role can contain one or more **Policies**. +A policy is a rule that gives access to a single **function** in a **module**. +For example, a `section/assign` policy allows the user to assign content to sections. When you add a policy to a role, you can also restrict it using one or more **Limitations**. A policy with a limitation only applies when the condition in the limitation is fulfilled. For example, a `content/publish` policy with a `ContentType` limitation on the "Blog Post" content type allows the user to publish only Blog Posts, and not other content. A limitation, like a policy, specifies what a user *can* do, not what they *can't do*. -A `Section` limitation, for example, *gives* the user access to the selected Section, not *prohibits* it. +A `Section` limitation, for example, *gives* the user access to the selected section, not *prohibits* it. For more information, see [Limitation reference](limitation_reference.md) and [Permission use cases](permission_use_cases.md). ## Assigning roles to users -Every user or user group can have many roles. A user can also belong to many groups, for example, Administrators, Editors, Subscribers. +Every user or user group can have many roles. +A user can also belong to many groups, for example, Administrators, Editors, Subscribers. -it's best practice to avoid assigning roles to users directly. +It's best practice to avoid assigning roles to users directly. Instead, try to organize your content so that it can be covered with general roles assigned to user groups. -Using Groups is easier to manage and more secure. It also improves system performance. +Using groups is easier to manage and more secure. +It also improves system performance. The more role assignments and complex policies you add for a given user, the more complex the search/load queries are, because they always take permissions into account. ## Permissions for custom controllers @@ -53,7 +56,7 @@ public function performAccessCheck(): void - `valueObject` is the object you want to check for, for example `ContentInfo`. - `targets` are a table of value objects that are the target of the operation. For example, to check if content can be assigned to a Section, provide the Section as `targets`. - `targets` accept Location, Object state and Section objects. + `targets` accept location, Object state and section objects. ### Checking user access diff --git a/docs/permissions/permission_use_cases.md b/docs/permissions/permission_use_cases.md index 3db1d2d3df..e826007f0f 100644 --- a/docs/permissions/permission_use_cases.md +++ b/docs/permissions/permission_use_cases.md @@ -8,7 +8,7 @@ Here are a few examples of sets of policies that you can use to get some common ## Enter back office -To allow the User to enter the back office interface and view all content, set the following policies: +To allow the user to enter the back office interface and view all content, set the following policies: - `user/login` - `content/read` @@ -22,14 +22,12 @@ These policies are necessary for all other cases below that require access to th You can use this option together with [[= product_name_exp =]]'s content review options. Users assigned with these policies can create content, but cannot publish it. -To publish, they must send the content for review to another User with proper permissions -(for example, senior editor, proofreader, etc.). +To publish, they must send the content for review to another User with proper permissions (for example, senior editor, proofreader, etc.). - `content/create` - `content/edit` -Use this setup with [[= product_name_exp =]] or [[= product_name_com =]] only, -as [[= product_name_headless =]] doesn't allow the User to continue working with their content. +Use this setup with [[= product_name_exp =]] or [[= product_name_com =]] only, as [[= product_name_headless =]] doesn't allow the User to continue working with their content. ## Create and publish content @@ -39,29 +37,28 @@ To create and publish content, users must additionally have the following polici - `content/edit` - `content/publish` -This also lets the user copy and move content, and add new Locations to a content item (but not remove them). +This also lets the user copy and move content, and add new locations to a content item (but not remove them). ## Move content -To move a content item or a Subtree to another Location, the user must have the following policies: +To move a content item or a subtree to another location, the user must have the following policies: - `content/read` - on the source Location - `content/create` - on the target Location ## Remove content -To send content to Trash, the User needs to have the `content/remove` policy. -If content has more than one language, the User must have access to all the languages. +To send content to Trash, the user needs to have the `content/remove` policy. +If content has more than one language, the user must have access to all the languages. That is, the `content/remove` policy must have either no limitation, or a limitation for all languages of the content item. -To remove an archived version of content, the User must have the `content/versionremove` policy. +To remove an archived version of content, the user must have the `content/versionremove` policy. Further manipulation of Trash requires the `content/restore` policy to restore items from Trash, and `content/cleantrash` to completely delete all content from the Trash. !!! caution - With the `content/cleantrash` policy, the User can empty the Trash even if they don't have access to the trashed content, - for example, because it belonged to a Section that the user doesn't have permissions for. + With the `content/cleantrash` policy, the user can empty the Trash even if they don't have access to the trashed content, for example, because it belonged to a Section that the user doesn't have permissions for. ## Restrict editing to part of the tree @@ -71,39 +68,35 @@ Three limitations that you could use here are `Section` limitation, `Location` l ### Section limitation Let's assume you have two Folders under your Home: Blog and Articles. -You can let a User create content for the blogs, but not in Articles, by adding a `Section` limitation to -the Blog content item. -This allows the User to publish content anywhere under this Location in the structure. -Section doesn't have to belong to the same Subtree of Location in the content structure, any Locations can be assigned to it. +You can let a user create content for the blogs, but not in Articles, by adding a `Section` limitation to the Blog content item. +This allows the User to publish content anywhere under this location in the structure. +Section doesn't have to belong to the same subtree of location in the content structure, any locations can be assigned to it. ### Location limitation -If you add a `Location` limitation and point to the same Location, the User is able to publish content directly -under the selected Location, but not anywhere deeper in its Subtree of Location. +If you add a `Location` limitation and point to the same location, the user is able to publish content directly under the selected Location, but not anywhere deeper in its subtree of location. -### Subtree of Location limitation +### Subtree of location limitation -To limit the User's access to a subtree, use the `Subtree of Location` limitation. +To limit the user's access to a subtree, use the `Subtree of Location` limitation. You do it by creating two new roles for a user group: - + 1. Role with a `Subtree` limitation for the User 1. Role with a `Location` limitation for the Subtree Follow the example below to learn how to do that. -**Cookbook**, **Dinner recipes** and **Dessert recipes** containers aren't accessible in the frontend. -Edit access to them in the **Admin** panel. +**Cookbook**, **Dinner recipes** and **Dessert recipes** containers aren't accessible in the frontend. +Edit access to them in the **Admin** panel. ![Subtree file structure](subtree_usability_notes_1.png) -To give the vegetarian editors access only to the **Vegetarian** dinner recipes section, - create a new role, for example, *EditorVeg*. +To give the vegetarian editors access only to the **Vegetarian** dinner recipes section, create a new role, for example, *EditorVeg*. Next, add to it a `content/read` policy with the `Subtree` limitation for `Cookbook/Dinner recipes/Vegetarian`. Assign the role to the vegetarian editors user group. It allows users from that group to access the **Vegetarian** container but not **Cookbook** and **Dinner recipes**. -To give users access to **Cookbook** and **Dinner recipes** containers, -create a new role, for example, *EditorVegAccess*. +To give users access to **Cookbook** and **Dinner recipes** containers, create a new role, for example, *EditorVegAccess*. Next, add to it a `content/read` policy with the `Location` limitations **Cookbook** and **Dinner recipes**. Assign the new role to the vegetarian editors user group as well. Only then the limitations are combined with `AND`, resulting in an empty set. @@ -113,15 +106,13 @@ The vegetarian editors should now see the following content tree: ![Limited subtree file structure](subtree_usability_notes_2.png) When a policy has more than one limitation, all of them have to apply, or the policy doesn't work. -For example, a `Location` limitation on Location `1/2` and `Subtree of Location` limitation on `1/2/55` cannot work together, -because no Location can satisfy both those requirements at the same time. -To combine more than one limitation with the *or* relation, not *and*, -you can split your policy in two, each with one of these limitations. +For example, a `Location` limitation on Location `1/2` and `Subtree of Location` limitation on `1/2/55` cannot work together, because no location can satisfy both those requirements at the same time. +To combine more than one limitation with the *or* relation, not *and*, you can split your policy in two, each with one of these limitations. -## Manage Locations +## Manage locations -To add a new Location to a content item, the policies required for publishing content are enough. -To allow the User to remove a Location, grant them the following policies: +To add a new location to a content item, the policies required for publishing content are enough. +To allow the user to remove a location, grant them the following policies: - `content/remove` - `content/manage_locations` @@ -137,8 +128,7 @@ Do this by adding the `WorkflowStageLimitation` to `content` policies such as `c You can also control which transitions the user can pass content through. Do this by using the `workflow/change_stage` policy together with the `WorkflowTransitionLimitation`. -For example, to enable the user to edit only content in the "Design" stage -and to pass it after creating design to the "Proofread stage", use following permissions: +For example, to enable the user to edit only content in the "Design" stage and to pass it after creating design to the "Proofread stage", use following permissions: - `content/edit` with `WorkflowStageLimitation` set to "Design". - `workflow/change_stage` with `WorkflowTransitionLimitation` set to `to_proofreading` @@ -152,28 +142,25 @@ To enable upload, you need you set the following permissions: - `content/read` - `content/publish` -You can control what content items can be uploaded and where by using imitations -on the `content/create` and `content/publish` policies. +You can control what content items can be uploaded and where by using imitations on the `content/create` and `content/publish` policies. -A Location limitation limits the uploading to a specific Location in the tree. +A Location limitation limits the uploading to a specific location in the tree. A content type limitation controls the content types that are allowed. -For example, you can set the Location limitation on a **Pictures** Folder, and add a content type limitation -that only allows content items of type **Image**. -This ensures that only files of type `image` can be uploaded, -and only to the **Pictures** Folder. +For example, you can set the location limitation on a **Pictures** Folder, and add a content type limitation that only allows content items of type **Image**. +This ensures that only files of type `image` can be uploaded, and only to the **Pictures** Folder. ## Taxonomies -You can control which users or user groups can work with taxonomies. +You can control which users or user groups can work with taxonomies. To let users create and assign taxonomy entries, set the following permissions: - `taxonomy/assign` to allow user to tag and untag content - `taxonomy/read` to see the Taxonomy interface - `taxonomy/manage` to create, edit and delete tags -With limitations, you can configure whether permissions apply to Tags, product categories or both. +With limitations, you can configure whether permissions apply to Tags, product categories, or both. -## Register Users +## Register users To allow anonymous users to register through the `/register` route, grant the `user/register` policy to the Anonymous user group. @@ -190,9 +177,9 @@ Additional policies are needed for each section of the Admin. ### Sections -- `section/view` to see and access the Section list -- `section/edit` to add and edit Sections -- `section/assign` to assign Sections to content +- `section/view` to see and access the section list +- `section/edit` to add and edit sections +- `section/assign` to assign sections to content ### Languages @@ -205,7 +192,7 @@ Additional policies are needed for each section of the Admin. ### Object states - `state/administrate` to view a list of Object states, add and edit them -- `state/assign` to assign Objects states to Content +- `state/assign` to assign Objects states to content ### Roles @@ -214,9 +201,9 @@ Additional policies are needed for each section of the Admin. ### Users -- `content/view` to view the list of Users +- `content/view` to view the list of users -Users are treated like other content, so to create and modify them, the User needs to have the same permissions as for managing other content items. +Users are treated like other content, so to create and modify them, the user needs to have the same permissions as for managing other content items. ## Product catalog @@ -224,7 +211,7 @@ You can control to what extend users can access the product catalog and all its ### Product type -To create or edit product types, a user needs to have access to attributes and attribute groups. +To create or edit product types, a user needs to have access to attributes and attribute groups. Set the following permissions to allow such access: - `product_type/create` @@ -233,9 +220,8 @@ Set the following permissions to allow such access: ### Product item -When a product is created, a product item and a content item are also generated. -Permissions for the product catalog override permissions for content, therefore, -users without permissions for content can still manage products. +When a product is created, a product item and a content item are also generated. +Permissions for the product catalog override permissions for content, therefore, users without permissions for content can still manage products. - `product/create` - `product/view` @@ -243,48 +229,40 @@ users without permissions for content can still manage products. ## Commerce [[% include 'snippets/commerce_badge.md' %]] -To control which commerce functionalities are available to store users, you can grant -or prevent them access to individual components. +To control which commerce functionalities are available to store users, you can grant or prevent them access to individual components. -Out of the box, [[= product_name_com =]] comes with the *Storefront User* Role that is assigned to anonymous users and grants them the following permissions: +Out of the box, [[= product_name_com =]] comes with the *Storefront User* role that is assigned to anonymous users and grants them the following permissions: -- `product/view`, `product_type/view` and `catalog/view`, to allow them to view a product -list and product details +- `product/view`, `product_type/view` and `catalog/view`, to allow them to view a product list and product details - `cart/view`, `cart/create` and `cart/edit` with the `CartOwner` limitation set to `self`, to allow them to add items to their own shopping cart, modify their cart, and delete it -- `checkout/view`, `checkout/create`, `checkout/update` and `checkout/delete`, to allow -them to proceed to checkout and interact with the checkout process +- `checkout/view`, `checkout/create`, `checkout/update` and `checkout/delete`, to allow them to proceed to checkout and interact with the checkout process -You can modify the default roles by preventing anonymous users from being able to proceed with the checkout process, -and creating the *Registered Buyer* role that enables logged-in users to purchase products. +You can modify the default roles by preventing anonymous users from being able to proceed with the checkout process, and creating the *Registered Buyer* role that enables logged-in users to purchase products. -You could do this by moving permissions that relate to checkout from the *Storefront User* role to the *Registered Buyer* role, -and granting *Registered Buyer* with the `user/register` and `user/login` permissions which control access to registration and login. +You could do this by moving permissions that relate to checkout from the *Storefront User* role to the *Registered Buyer* role, and granting *Registered Buyer* with the `user/register` and `user/login` permissions which control access to registration and login. See below for a detailed listing of permissions that apply to Commerce, together with their meaning. !!! note "Owner limitation" - For anonymous users, orders, shipments, and/or payments are saved with a 'null' user reference. + For anonymous users, orders, shipments, and/or payments are saved with a 'null' user reference. Therefore, when you apply the `Owner/self` imitation to any of the permissions below, anonymous users aren't allowed to interact with any of these entities. -### Cart +### Cart -Set the following permissions to decide what actions are available when users -interact with carts: +Set the following permissions to decide what actions are available when users interact with carts: -- `cart/view` - to allow user to view their cart +- `cart/view` - to allow user to view their cart - `cart/delete` - to delete cart, for example, after successful checkout - `cart/create` - to create a new cart - `cart/edit` - to allow user to add products to their cart -To further control access to a cart, you can use the `CartOwner` limitation -and set its value to `self`. +To further control access to a cart, you can use the `CartOwner` limitation and set its value to `self` This way users can only interact with their own carts. -### Checkout +### Checkout -Set the following permissions to decide what actions are available when users -interact with checkout: +Set the following permissions to decide what actions are available when users interact with checkout: - `checkout/view` - to control user access to checkout - `checkout/create` - to allow starting the checkout process, by proceeding from cart @@ -293,60 +271,54 @@ interact with checkout: ### Order management -Set the following permissions to decide what actions are available when users -interact with orders: +Set the following permissions to decide what actions are available when users interact with orders: - `order/create` - to allow the user to create a new order - `order/view` - to allow the user to view orders -- `order/update` - to allow the user to change status of an existing order -- `order/cancel` - to allow the user to cancel an existing order +- `order/update` - to allow the user to change status of an existing order +- `order/cancel` - to allow the user to cancel an existing order -To further control access to an order, you can use the `OrderOwner` limitation -and set its value to `self`. +To further control access to an order, you can use the `OrderOwner` limitation and set its value to `self`. This way users can only interact with their own orders. ### Shipping management -Set the following permissions to decide what actions are available when users -interact with shipping methods and shipments. +Set the following permissions to decide what actions are available when users interact with shipping methods and shipments. #### Shipping methods - `shipping_method/create` - to allow the user to create a new shipping method - `shipping_method/view` - to allow the user to view shipping methods -- `shipping_method/edit` - to allow the user to modify an existing shipping method -- `shipping_method/delete` - to allow the user to delete an existing shipping method +- `shipping_method/edit` - to allow the user to modify an existing shipping method +- `shipping_method/delete` - to allow the user to delete an existing shipping method #### Shipments - `shipment/create` - to allow the user to create a new shipment - `shipment/view` - to allow the user to view shipments -- `shipment/update` - to allow the user to change status of an existing shipment -- `shipment/delete` - to allow the user to cancel an existing shipment +- `shipment/update` - to allow the user to change status of an existing shipment +- `shipment/delete` - to allow the user to cancel an existing shipment -To further control access to a shipment, you can use the `ShipmentOwner` limitation -and set its value to `self`. +To further control access to a shipment, you can use the `ShipmentOwner` limitation and set its value to `self`. This way users can only interact with their own shipments. ### Payment management -Set the following permissions to decide what actions are available when users -interact with payment methods and payments. +Set the following permissions to decide what actions are available when users interact with payment methods and payments. #### Payment methods - `payment_method/create` - to allow the user to create a new payment method - `payment_method/view` - to allow the user to view payment methods -- `payment_method/edit` - to allow the user to modify an existing payment method -- `payment_method/delete` - to allow the user to delete an existing payment method +- `payment_method/edit` - to allow the user to modify an existing payment method +- `payment_method/delete` - to allow the user to delete an existing payment method #### Payments - `payment/create` - to allow the user to create a new payment - `payment/view` - to allow the user to view payments -- `payment/edit` - to allow the user to modify an existing payment -- `payment/delete` - to allow the user to delete an existing payment +- `payment/edit` - to allow the user to modify an existing payment +- `payment/delete` - to allow the user to delete an existing payment -To further control access to a payment, you can use the `PaymentOwner` limitation -and set its value to `self`. +To further control access to a payment, you can use the `PaymentOwner` limitation and set its value to `self`. This way users can only interact with their own payments. diff --git a/docs/permissions/policies.md b/docs/permissions/policies.md index 863def3208..c1ae558086 100644 --- a/docs/permissions/policies.md +++ b/docs/permissions/policies.md @@ -6,8 +6,7 @@ page_type: reference # Policies Policies are the main building block of the permissions system. -Each role you assign to user or user group consists of policies -which define, which parts of the application or website the user has access to. +Each role you assign to user or user group consists of policies which define, which parts of the application or website the user has access to. ## Available policies @@ -67,7 +66,7 @@ which define, which parts of the application or website the user has access to. #### Sites [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -| Module | Function | Effect | Possible Limitations | +| Module | Function | Effect | Possible limitations | |---------------------|------------------------------|-------------------------------------------------------------------------------------------------------|----------------------| | `site` | `change_status` | change status of the public accesses of sites to `Live` or `Offline` in the Site Factory | | | `create` | create sites in the Site Factory | @@ -78,7 +77,7 @@ which define, which parts of the application or website the user has access to. #### Users -| Module | Function | Effect | Possible Limitations | +| Module | Function | Effect | Possible limitations | |---------------------|----------------------------|---------------------------------------------------|----------------------| | `user` | `activation` | unused | | | `invite` | create and send invitations to create an account | @@ -92,7 +91,7 @@ which define, which parts of the application or website the user has access to. #### Cart [[% include 'snippets/commerce_badge.md' %]] -| Module | Function | Effect | Possible Limitations | +| Module | Function | Effect | Possible limitations | |---------------------|-----------------------|---------------------------------------------------------------------|-----------------------------------------------------------| | `cart` | `create` | create a cart | [CartOwner](limitation_reference.md#cartowner-limitation) | | | `delete` | delete cart, for example, after successful checkout | [CartOwner](limitation_reference.md#cartowner-limitation) | @@ -186,7 +185,7 @@ which define, which parts of the application or website the user has access to. | Module | Function | Effect | Possible limitations | |------------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `content` | `cleantrash` | empty the Trash (even when the User doesn't have access to individual content items) | -| | `create` | create new content. Note: even without this Policy the User is able to enter edit mode, but cannot finalize work with the content item. | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation)
[Owner of Parent](limitation_reference.md#owner-of-parent-limitation)
[Content type Group of Parent](limitation_reference.md#content-type-group-of-parent-limitation)
[Content type of Parent](limitation_reference.md#content-type-of-parent-limitation)
[Parent Depth](limitation_reference.md#parent-depth-limitation)
[Field Group](limitation_reference.md#field-group-limitation)
[Change Owner](limitation_reference.md#change-owner-limitation) | +| | `create` | create new content. Note: even without this policy the user is able to enter edit mode, but cannot finalize work with the content item. | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation)
[Owner of Parent](limitation_reference.md#owner-of-parent-limitation)
[Content type Group of Parent](limitation_reference.md#content-type-group-of-parent-limitation)
[Content type of Parent](limitation_reference.md#content-type-of-parent-limitation)
[Parent Depth](limitation_reference.md#parent-depth-limitation)
[Field Group](limitation_reference.md#field-group-limitation)
[Change Owner](limitation_reference.md#change-owner-limitation) | | | `diff` | unused | | | `edit` | edit existing content | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Owner](limitation_reference.md#owner-limitation)
[Content type Group](limitation_reference.md#content-type-group-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation)
[Object State](limitation_reference.md#object-state-limitation)
[Workflow Stage](limitation_reference.md#workflow-stage-limitation)
[Field Group](limitation_reference.md#field-group-limitation)
[Version Lock](limitation_reference.md#version-lock-limitation)
[Change Owner](limitation_reference.md#change-owner-limitation) | | | `hide` | hide and reveal content Locations | [Content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Owner](limitation_reference.md#owner-limitation)
[Content type Group](limitation_reference.md#content-type-group-limitation)
[Location](limitation_reference.md#location-limitation)
[Subtree](limitation_reference.md#subtree-limitation)
[Language](limitation_reference.md#language-limitation) | @@ -219,7 +218,7 @@ which define, which parts of the application or website the user has access to. |------------------------|-----------------------|----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `section` | `assign` | assign Sections to content | [content type](limitation_reference.md#content-type-limitation)
[Section](limitation_reference.md#section-limitation)
[Owner](limitation_reference.md#owner-limitation)
[New Section](limitation_reference.md#new-section-limitation) | | | `edit` | edit existing Sections and create new ones | -| | `view` | view the Sections list in Admin. Required for all other section-related Policies | +| | `view` | view the Sections list in Admin. Required for all other section-related policies | #### Object States @@ -267,15 +266,13 @@ which define, which parts of the application or website the user has access to. | Module | Function | Effect | Possible limitations | |-----------------------------|-----------------------|-----------------------------------------------------------------------------------------------------------------|----------------------| -| `product_type` | `create` | create a product type, a new attribute, a new attribute group and add translation to product type and attribute | +| `product_type` | `create` | create a product type, a new attribute, a new attribute group, and add translation to product type and attribute | | | `delete` | delete a product type, attribute, attribute group | | | `edit` | edit a product type, attribute, attribute group | | | `view` | view product types, attributes and attribute groups | ## Combining policies -Policies on one role are connected with the *and* relation, not *or*, -so when policy has more than one limitation, all of them have to apply. +Policies on one role are connected with the *and* relation, not *or*, so when policy has more than one limitation, all of them have to apply. -If you want to combine more than one limitation with the *or* relation, not *and*, -you can split your policy in two, each with one of these limitations. +If you want to combine more than one limitation with the *or* relation, not *and*, you can split your policy in two, each with one of these limitations. From 2c62c4adf3e7ac800cf08be893c47165e471ff91 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Thu, 17 Oct 2024 09:07:33 +0200 Subject: [PATCH 46/77] Fixes in 'personalization' --- .../api_reference/content_api.md | 68 ++--- .../api_reference/recommendation_api.md | 80 +++--- .../api_reference/tracking_api.md | 236 ++++++------------ .../personalization/api_reference/user_api.md | 32 +-- .../attribute_search_in_elasticsearch.md | 7 +- .../personalization/enable_personalization.md | 113 +++------ ...importing_historical_user_tracking_data.md | 24 +- .../integrate_recommendation_service.md | 16 +- .../legacy_recommendation_api.md | 45 ++-- docs/personalization/personalization.md | 5 +- docs/personalization/personalization_guide.md | 35 ++- .../recommendation_integration.md | 60 ++--- docs/personalization/tracking_integration.md | 54 ++-- .../tracking_with_ibexa-tracker.md | 65 ++--- 14 files changed, 304 insertions(+), 536 deletions(-) diff --git a/docs/personalization/api_reference/content_api.md b/docs/personalization/api_reference/content_api.md index 5e61f89e60..22d0aa5f85 100644 --- a/docs/personalization/api_reference/content_api.md +++ b/docs/personalization/api_reference/content_api.md @@ -4,10 +4,8 @@ description: Personalization server can use external information about the items # Content API -Apart from the [events]([[= user_doc =]]/personalization/event_types) collected by the Personalization client, -the Personalization server can use external information about the products. -This information must be uploaded to the Personalization server by the administrator -of the website. +Apart from the [events]([[= user_doc =]]/personalization/event_types) collected by the Personalization client, the Personalization server can use external information about the products. +This information must be uploaded to the Personalization server by the administrator of the website. The following information can be loaded to the recommendation solution: @@ -18,22 +16,19 @@ The following information can be loaded to the recommendation solution: For more information about personalization, see [Introduction](personalization.md) and [Best practices](recommendation_integration.md). The Personalization client provides a REST interface that accepts items in XML format. -You can use the interface to post item information within the request's body into the store,  -and to display or update the items directly. +You can use the interface to post item information within the request's body into the store, and to display or update the items directly. You can use HTTP methods to create, update or retrieve items that are in the data store. !!! note "Authentication" For getting or posting content data, basic authentication is enabled by default. - Use your customer ID and license key as username and password. - If authentication is enabled for recommendation requests and you want to change - this, contact support@ibexa.co. + Use your customer ID and license key as username and password. + If authentication is enabled for recommendation requests and you want to change this, contact support@ibexa.co. ## GET requests -Use the GET method to retrieve all information that is stored in the database -for the given item ID: +Use the GET method to retrieve all information that is stored in the database for the given item ID: `GET: https://admin.perso.ibexa.co/api/[customerid]/item/[itemtypeid]/[itemid]` @@ -48,7 +43,7 @@ Once uploaded, the item is scheduled to be inserted in the database, and isn't d ## DELETE requests -Use the DELETE method to delete all information that is related to the given item ID. +Use the DELETE method to delete all information that is related to the given item ID. `DELETE: https://admin.perso.ibexa.co/api/[customerid]/item/[itemtypeid]/[itemid]?lang=` @@ -67,7 +62,7 @@ The following call attributes are available: ### Request object format -An XML representation of the data object used for item import can look like this: +An XML representation of the data object used for item import can look like this: ``` xml @@ -103,8 +98,7 @@ An XML representation of the data object used for item import can look like this !!! note "XML schema definition" - The current schema that is used for interpreting the XML objects - can be seen [here](https://admin.perso.ibexa.co/api/00000/item/schema.xsd). + The current schema that is used for interpreting the XML objects can be seen [here](https://admin.perso.ibexa.co/api/00000/item/schema.xsd). The following keys and attributes used in the XML object are available: @@ -137,62 +131,53 @@ To check how many digits the fractional unit of a currency has, see the [ISO 421 ##### Validity -Items with defined validity are recommended only in the specified timeframe. -Values in the `validto` and `validfrom` attributes must follow the [XSD format](https://www.w3.org/TR/xmlschema-2/#dateTime) -and don't include the time zone. +Items with defined validity are recommended only in the specified timeframe. +Values in the `validto` and `validfrom` attributes must follow the [XSD format](https://www.w3.org/TR/xmlschema-2/#dateTime) and don't include the time zone. Time zone is always your time zone. ##### Category path -With the data import interface, you can upload information about the paths -to categories in which the product is located. +With the data import interface, you can upload information about the paths to categories in which the product is located. However, the category path can be also updated as a result of the "Click" events. -If you regularly upload product data, the "Click" event cannot contain the category -path information. +If you regularly upload product data, the "Click" event cannot contain the category path information. Otherwise, the following negative side effects occur: - Every new category path attached to the "Click" event is appended to a list of the categories of the product - Imported product data overwrites the collected category paths -For example, when a product that is originally located under `Garden` is clicked -in the "Hot Sellers" section, the category path `TopSeller` is sent. +For example, when a product that is originally located under `Garden` is clicked in the "Hot Sellers" section, the category path `TopSeller` is sent. #### Content items/products with no attributes All the elements and attributes except the `type` and `id` are optional. You can therefore upload a product without any additional information. -You do it, for example, when a random recommendation model is used -or you want to want to apply ad-hoc boosting and filtering of recommendations. +You do it, for example, when a random recommendation model is used or you want to want to apply ad-hoc boosting and filtering of recommendations. As a result, the Personalization server randomly recommends the imported items/products. -This can prove useful for a news agency, where new items are published very often. +This can prove useful for a news agency, where new items are published often. #### Custom attributes You can also define custom attributes under the `` key. This section can only contain values that are distinct and used to build pre-filtered models. -By default, it's assumed that every attribute is of type "NOMINAL", which means that -there is a limited set of values, and values of an attribute are treated as distinct -when calculating the results of a content-based model. +By default, it's assumed that every attribute is of type "NOMINAL", which means that there is a limited set of values, and values of an attribute are treated as distinct when calculating the results of a content-based model. -If you have an attribute that is of type "NUMERIC", and you add another attribute -of the same type, the Personalization server treats the two values as a range. +If you have an attribute that is of type "NUMERIC", and you add another attribute of the same type, the Personalization server treats the two values as a range. ``` xml ``` -However, if the other attribute is of type "NOMINAL", they're both treated -as different and have no "distance-based similarity". +However, if the other attribute is of type "NOMINAL", they're both treated as different and have no "distance-based similarity". -Another typical example of a custom attribute is the color of an item. +Another typical example of a custom attribute is the color of an item. To upload the value to the data store, add the following line under the `` key. ``` xml ``` -You can have multiple attributes with the same name and different type. +You can have multiple attributes with the same name and different type. For example, `size` can be expressed as a number (40.5) or as a code ("L"). ## Responses @@ -210,11 +195,8 @@ The following HTTP response codes are used by the recommendation controller: ## Transferring item identifiers -You could use the data import interface to help migrate the database, -when it involves changing item IDs of items that are supported by the -Personalization server. -If you transfer items from one ID to another, you can use the events recorded -for "old" item IDs to calculate model results that present "new" IDs. +You could use the data import interface to help migrate the database, when it involves changing item IDs of items that are supported by the Personalization server. +If you transfer items from one ID to another, you can use the events recorded for "old" item IDs to calculate model results that present "new" IDs. Use the following method to pass the XML object: @@ -235,6 +217,4 @@ The old item is wiped, including all attributes. !!! note - The attributes of the "old" item ID aren't moved or merged, and if you - rely on attributes, for example, for filtering based on prices, - you must reimport the new item. + The attributes of the "old" item ID aren't moved or merged, and if you rely on attributes, for example, for filtering based on prices, you must reimport the new item. diff --git a/docs/personalization/api_reference/recommendation_api.md b/docs/personalization/api_reference/recommendation_api.md index 809cfc1c61..80719869f1 100644 --- a/docs/personalization/api_reference/recommendation_api.md +++ b/docs/personalization/api_reference/recommendation_api.md @@ -4,19 +4,15 @@ description: Use HTTP GET request method to render recommendations. # Recommendation API -Recommendations are retrieved from the Personalization server with RESTful requests -that rely on the HTTP GET method. -The result can a list of item IDs that can then be used to call the underlying -CMS or shop system and postload the necessary information for the rendering process. +Recommendations are retrieved from the Personalization server with RESTful requests that rely on the HTTP GET method. +The result can a list of item IDs that can then be used to call the underlying CMS or shop system and postload the necessary information for the rendering process. For more information about Personalization, see [Introduction](personalization.md) and [Basic integration](recommendation_integration.md). !!! note "Authentication" - For fetching recommendations, authentication is disabled by default, and - it must be disabled when you use [JSONP](https://en.wikipedia.org/wiki/JSONP) for response handling. - If authentication is enabled for recommendation requests and you want to change - this, contact support@ibexa.co. + For fetching recommendations, authentication is disabled by default, and it must be disabled when you use [JSONP](https://en.wikipedia.org/wiki/JSONP) for response handling. + If authentication is enabled for recommendation requests and you want to change this, contact support@ibexa.co. ## GET requests @@ -31,33 +27,30 @@ For the request to return recommendations, you must provide the following parame |Parameter|Description|Value| |---|---|---| |`customerid`|A customer ID (for example "00000"), as defined when [enabling Personalization](enable_personalization.md#set-up-customer-credentials). Can be used to identify a website in installations that [hosts multiple SiteAccesses]([[= user_doc =]]/personalization/use_cases/#multiple-website-hosting).|alphanumeric| -|`userid`|An ID of the tracked user in the website (for example, an internal customer code, a session code or a cookie for anonymous users.|alphanumeric| +|`userid`|An ID of the tracked user in the website (for example, an internal customer code, a session code, or a cookie for anonymous users.|alphanumeric| |`scenarioid`|An ID of the scenario used for providing recommendations, as defined in the back office.|alphanumeric| |`extension`|A format of the response (either JSON or JSONP).|`json` or `jsonp`| !!! caution "Parameter encoding limitations" - All parameters must be URL-encoded (see RFC 3986) and cannot contain a backslash - (`%5C`) character. + All parameters must be URL-encoded (see RFC 3986) and cannot contain a backslash (`%5C`) character. ### Customizing the recommendation request -You can customize the recommendation request by using additional query string parameters. +You can customize the recommendation request by using additional query string parameters. For example, you can send the following request to the Personalization server:  `GET https://reco.perso.ibexa.co/api/v2/00000/john.doe/landing_page.json ?contextitems=123&categorypath=%2FCamera%2FCompact&attribute=title&attribute=deeplink,description&numrecs=8` -The request fetches 8 recommendations for user ID `john.doe`, who is viewing item 123 -and the category `/Camera/Compact`, based on the scenario with the identifier `landing_page`. -The recommendation response uses the JSON format and should include values of -`title`, `deeplink` and `description` attributes. +The request fetches 8 recommendations for user ID `john.doe`, who is viewing item 123 and the category `/Camera/Compact`, based on the scenario with the identifier `landing_page`. +The recommendation response uses the JSON format and should include values of `title`, `deeplink` and `description` attributes. You can use the following parameters to customize a request: |Parameter|Example|Description|Value| |---|---|---|---| |`numrecs`|20|Defines a number of recommendations to be delivered. The lower this value, the shorter the response time. The default value is 10. |1 to 50| -|`contextitems`|10,13,14 or "CLICKED"|A comma-separated list of items that the user is viewing on the web page. The list is required by [context-based recommendations]([[= user_doc =]]/personalization/recommendation_models). All items must be of the same type. The type is defined in the scenario configuration. If history code is used ("CLICKED","CONSUMED", "OWNS", "RATED" or "BASKET"), context items are pulled from the user profile (for example, the most recent clicks or purchases). This parameter is optional. |1 to 2147483647 (or alphanumeric if enabled)| +|`contextitems`|10,13,14, or "CLICKED"|A comma-separated list of items that the user is viewing on the web page. The list is required by [context-based recommendations]([[= user_doc =]]/personalization/recommendation_models). All items must be of the same type. The type is defined in the scenario configuration. If history code is used ("CLICKED","CONSUMED", "OWNS", "RATED" or "BASKET"), context items are pulled from the user profile (for example, the most recent clicks or purchases). This parameter is optional. |1 to 2147483647 (or alphanumeric if enabled)| |`outputtypeid`|1|Required for scenarios that are defined with multiple output item types, otherwise optional. By default it's the first/lowest output type enabled in the scenario config.|numeric| |`crosscontenttype`| |Used instead of `outputtypeid`, if set to true, displays recommendations for all output types defined in the scenario. | boolean| |`jsonpCallback`|"myCallback"|Function or method name (used for JSONP request only). It can be a function ("callme"), or a method ("obj.callme"). The default value is "jsonpCallback".|legal JavaScript function call| @@ -80,15 +73,14 @@ For more information, see [Submodels]([[= user_doc =]]/personalization/recommend !!! note "Multiple submodels in recommendations" If you send a request with two attribute keys, the response contains an intersection of two recommendation sets that originate from submodels calculated for these attributes. - + For example, to get recommendations for items of certain type that are limited by submodels based on both a nominal and numeric attribute, you can send the following request: - + `GET https://reco.perso.ibexa.co/api/v2/00000/john.doe/landing_page.json?numrecs=50&outputtypeid=1&width-range=10:30&color=green` ##### Segment parameters -If you have configured segments, you can use them in the recommendation model. Pass the following parameter -to request recommendations for a specific segment or segment group. +If you have configured segments, you can use them in the recommendation model. Pass the following parameter to request recommendations for a specific segment or segment group. Parameter|Example|Description|Value| |---|---|---|---| @@ -98,20 +90,17 @@ For more information, see [Segments]([[= user_doc =]]/personalization/segment_ma ## Responses -The recommendation request returns information about the currently used context -items and an array of recommendation objects in JSON or JSONP format. -The result can be integrated into any webpage on the client side by using script code. -To track user actions like "clickrecommended" and "rendered", use the links -delivered in the response. +The recommendation request returns information about the currently used context items and an array of recommendation objects in JSON or JSONP format. +The result can be integrated into any webpage on the client side by using script code. +To track user actions like "clickrecommended" and "rendered", use the links delivered in the response. For more information, see inline comments below. !!! note "Previewing recommendations" - You can preview the actual responses that come from the Personalization server - and how they're rendered in the user interface. + You can preview the actual responses that come from the Personalization server and how they're rendered in the user interface. For more information, see [Previewing scenario results]([[= user_doc =]]/personalization/previewing_scenario). - + For more information about integrating recommendations in the web page, see [Best practices](recommendation_integration.md). ### Response object format @@ -251,18 +240,13 @@ Error messages can change, don't use them for automated processing. !!! note "Rendering data" - If data import with the [Content API](content_api.md) was successful, you - can also fetch data used for rendering (for example "title", "description" - or "deeplink") from the recommendation response. + If data import with the [Content API](content_api.md) was successful, you can also fetch data used for rendering (for example "title", "description" or "deeplink") from the recommendation response. ## Cache recommendations -The Personalization server's response can be cached. -Depending on the recommendation model and context, it can drastically reduce -the number of recommendation requests. -The recommendation service supports the following HTTP headers to enable cache -control on the client side (all date values must follow the "HTTP-date" format -as defined by [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616)): +The Personalization server's response can be cached. +Depending on the recommendation model and context, it can drastically reduce the number of recommendation requests. +The recommendation service supports the following HTTP headers to enable cache control on the client side (all date values must follow the "HTTP-date" format as defined by [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616)): |Scope|Header|Description|Example| |---|---|---|---| @@ -270,22 +254,16 @@ as defined by [RFC 2616](https://datatracker.ietf.org/doc/html/rfc2616)): |Response|`Last-Modified`|The last modification date of the recommendations.|`Last-Modified: Tue, 15 Nov 2013 12:45:26 GMT`| |Response|`Expires`|Gives the date/time after which the response is outdated|`Expires: Thu, 01 Dec 2013 16:00:00 GMT`| -The last modification timestamp indicates a change that could influence the -recommendation response. -It depends on an updated recommendation calculation, an update of an item or -certain scenario configuration changes.  +The last modification timestamp indicates a change that could influence the recommendation response. +It depends on an updated recommendation calculation, an update of an item or certain scenario configuration changes.  -The expiration timestamp is a best-effort prediction based on the model configuration -and provided context. -The shortest expiration period is 5 minutes from the request time, the longest -is 24 hours. +The expiration timestamp is a best-effort prediction based on the model configuration and provided context. +The shortest expiration period is 5 minutes from the request time, the longest is 24 hours. -You don't usually have to calculate the expiration time manually. -Instead, make sure that the `Expires` header is used in the configuration -of your caching system and not a static value out of your configuration. +You don't usually have to calculate the expiration time manually. +Instead, make sure that the `Expires` header is used in the configuration of your caching system and not a static value out of your configuration. -To learn how Personalization server calculates the `Expires` header that's provided -to your caching system, see the following table with caching strategy examples: +To learn how Personalization server calculates the `Expires` header that's provided to your caching system, see the following table with caching strategy examples: | Model | Context | Expiration time | Description | |------|------|-----|-----| diff --git a/docs/personalization/api_reference/tracking_api.md b/docs/personalization/api_reference/tracking_api.md index d00c4a90af..7dcf9b9ec5 100644 --- a/docs/personalization/api_reference/tracking_api.md +++ b/docs/personalization/api_reference/tracking_api.md @@ -4,8 +4,7 @@ description: Allows to track items using it ID. It covers many content types wit # Tracking API -To provide recommendations, a tracking process needs to collect user behavior -on the customer's site. +To provide recommendations, a tracking process needs to collect user behavior on the customer's site. The most popular user events are: - Click - When a user opens a detail page. @@ -15,35 +14,29 @@ The most popular user events are: - Clickrecommended - When a user clicks a recommendation For a complete list of events, see [Event types]([[= user_doc =]]/personalization/event_types) in User Documentation.  -Depending on the event type, some additional parameters, such as item price -or user rating, must be provided. +Depending on the event type, some additional parameters, such as item price or user rating, must be provided. -Importing historical user data can help you reduce the delay in delivery of high -quality recommendations. +Importing historical user data can help you reduce the delay in delivery of high quality recommendations. For more information, see [Importing historical user tracking data](importing_historical_user_tracking_data.md). -Apart from the tracking API, you can add tracking to the website by integrating -a JavaScript library. +Apart from the tracking API, you can add tracking to the website by integrating a JavaScript library. For more information, see [Tracking with ibexa-tracker.js](tracking_with_ibexa-tracker.md). ## Definitions You can use the tracking API both in eCommerce and content publishing scenarios. -eCommerce mostly uses the term "product", whereas the Publisher domain widely -uses the terms "content", "article", "images" or "videos". +eCommerce mostly uses the term "product", whereas the Publisher domain widely uses the terms "content", "article", "images" or "videos". Therefore, a generic term "item" is used instead to cover all the mentioned types. -For further segmentation the term "item type" is used, which, in combination -with the item ID itself, defines a domain specific object. +For further segmentation the term "item type" is used, which, in combination with the item ID itself, defines a domain specific object. For example, an electronic product can be defined by item type "1" and item id "3298", while a textile product can be defined by item type "2" and item id "3298". !!! note - Usually only one item type is sufficient in the eCommerce business as each - product available in an eCommerce shop has a unique identifier. + Usually only one item type is sufficient in the eCommerce business as each product available in an eCommerce shop has a unique identifier. |Domain|Item ID|Item Type| |---|---|---| @@ -51,12 +44,9 @@ while a textile product can be defined by item type "2" and item id "3298". |Content publishing|Video|ID of a video| |Content publishing|Photo Gallery|ID of a photo gallery| -Assuming the numbering of content is independent and the same item ID is used -for two items of different item types, it's impossible to tell the difference -if there is no segmentation by item types. +Assuming the numbering of content is independent and the same item ID is used for two items of different item types, it's impossible to tell the difference if there is no segmentation by item types. -If an article, a video and a photo gallery have the same item ID, use different -item types to separate the items that are tracked. +If an article, a video and a photo gallery have the same item ID, use different item types to separate the items that are tracked. For example: - item type "1" and itemid "29712" -> article @@ -65,50 +55,37 @@ For example: !!! note - Even if item IDs cannot overlap in a customer's system, [[= product_name_base =]] recommends using - different item types to provide independent tracking and cross-item type recommendations, - such as, for example, "Users who read this article also watched these videos" - or "Users who liked this gallery also read these articles". + Even if item IDs cannot overlap in a customer's system, [[= product_name_base =]] recommends using different item types to provide independent tracking and cross-item type recommendations, such as, for example, "Users who read this article also watched these videos" or "Users who liked this gallery also read these articles". ## Identifiers ### User identifier -High quality recommendations can only be delivered if the underlying data -is correct and consistent.  +High quality recommendations can only be delivered if the underlying data is correct and consistent.  For consistent tracking it's crucial to choose and use a consistent identifier for a user. A user usually visits a website anonymously. -Therefore, their identifier is either a first-party cookie or a session ID -provided by the website.  -If there is no existing user ID handling that can be re-used, it's recommended that -you use your own cookie and set the expiry date to at least 90 days from the last usage. -If there is a login mechanism, the user is usually tracked with a temporary -identifier before the login. +Therefore, their identifier is either a first-party cookie or a session ID provided by the website.  +If there is no existing user ID handling that can be re-used, it's recommended that you use your own cookie and set the expiry date to at least 90 days from the last usage. +If there is a login mechanism, the user is usually tracked with a temporary identifier before the login. Immediately after a successful login process a Login event must be sent. -At this point a [pseudonymous](https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679&from=EN#d1e1489-1-1) user ID, -for example, a system's internal registration id, must be used.  +At this point a [pseudonymous](https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32016R0679&from=EN#d1e1489-1-1) user ID, for example, a system's internal registration id, must be used.  After logout, the anonymous user ID can be used again. !!! note - The user identifier is required in tracking requests, otherwise it's discarded - from the tracking servers. + The user identifier is required in tracking requests, otherwise it's discarded from the tracking servers. - If a browser has JavaScript or cookies disabled, make sure that you put some - "dummy" value as identifier in the tracking request to avoid losing tracking - information. + If a browser has JavaScript or cookies disabled, make sure that you put some "dummy" value as identifier in the tracking request to avoid losing tracking information. Even if the event isn't user-specific, it's still useful for [popularity models]([[= user_doc =]]/personalization/recommendation_models/). The Personalization server internally creates a hash of every user ID. The original ID isn't saved. -it's still possible that the original ID appears in the log files for the debugging -purposes but log files are purged regularly. +it's still possible that the original ID appears in the log files for the debugging purposes but log files are purged regularly. The user ID is case sensitive. ### Item identifiers -Persons responsible for the sales policy in place in your organization must decide -what should be presented as recommendations on the website. +Persons responsible for the sales policy in place in your organization must decide what should be presented as recommendations on the website. In the eCommerce business you mostly have the possibility to track items based on: - Stock Keeping Unit (SKU) or @@ -118,35 +95,24 @@ The exact identifiers that are tracked are also recommended ("what-you-track-is- By default, it's not possible to track SKUs but recommend UPCs. The following use case is typical for eCommerce business: -Customer A implements the Personalization server and decides to use the SKU -as item identifiers and recommendable items. -End users who browse through the shop probably get recommendations of -the same item that is currently displayed but in a different size and/or color, -a so-called "variant". -The Personalization server doesn't recognize relations between items, therefore, -every single SKU is used to calculate similarities between them. -In the case of bestsellers, this could lead to the appearance of a shirt -in size L on position 2 and the same shirt in size M on position 4. +Customer A implements the Personalization server and decides to use the SKU as item identifiers and recommendable items. +End users who browse through the shop probably get recommendations of the same item that is currently displayed but in a different size and/or color, a so-called "variant". +The Personalization server doesn't recognize relations between items, therefore, every single SKU is used to calculate similarities between them. +In the case of bestsellers, this could lead to the appearance of a shirt in size L on position 2 and the same shirt in size M on position 4. Customer B decides to use the UPC as item identifiers. This results in recommendations that don't contain variations of the currently shown item. -Therefore, the detail page of shirt X doesn't contain a recommendation -for the same shirt in a different size. +Therefore, the detail page of shirt X doesn't contain a recommendation for the same shirt in a different size. And the same shirt doesn't show up twice on a list of bestseller recommendations. -If the size of an item or the color is selectable on a detail page of an item, -you may prefer to use the UPC. -If recommendations of the same item in different sizes or colors are desired, -you should use the SKU as item identifiers. +If the size of an item or the color is selectable on a detail page of an item, you may prefer to use the UPC. +If recommendations of the same item in different sizes or colors are desired, you should use the SKU as item identifiers. -Remember to use the same identifier in all interactions between your website -and the Personalization server, for example, when a user buys an item, -clicks a recommendation or displays a product page. +Remember to use the same identifier in all interactions between your website and the Personalization server, for example, when a user buys an item, clicks a recommendation, or displays a product page. ## Request parameter categorypath -Category paths are logical tree structures that lead to items and are used for -recommendation filtering. +Category paths are logical tree structures that lead to items and are used for recommendation filtering. For example, "recommend only items from the same category". During recommendation requests, the category path must always be provided. @@ -154,27 +120,21 @@ The category path is a forward slash-separated list of categories from the root, The initial slash (if present) is ignored. Like all other parameters, the category path must be URL-encoded and cannot contain backslashes. -The "categorypath" parameter offers the possibility to provide category-based -recommendations without an explicit export of the structure of a customer's website. +The "categorypath" parameter offers the possibility to provide category-based recommendations without an explicit export of the structure of a customer's website. If enabled by [[= product_name_base =]], it's used for on-the-fly updating of item categories. -If an item is moved to another category, it's handled as present in both -categories until the old category ages out or is forcibly deleted. +If an item is moved to another category, it's handled as present in both categories until the old category ages out or is forcibly deleted. Multiple category locations of an item (multi-homing) are therefore possible. !!! note "Category paths" - When you import your own item metadata by using the Personalization server - import interface, you might choose to not provide the category path - in the Click event. - Category path is required by default, contact [[= product_name_base =]] to change the default - configuration. + When you import your own item metadata by using the Personalization server import interface, you might choose to not provide the category path in the Click event. + Category path is required by default, contact [[= product_name_base =]] to change the default configuration. ## Track events !!! note - Events are forwarded to the Personalization server with HTTP or HTTPS requests - (or [RESTful-Requests](https://en.wikipedia.org/wiki/Representational_state_transfer)). + Events are forwarded to the Personalization server with HTTP or HTTPS requests (or [RESTful-Requests](https://en.wikipedia.org/wiki/Representational_state_transfer)). Both GET and POST methods are allowed for the event tracking. Make sure that all embedded and query string parameters are URL encoded and don't use a backslash, encoded as %5C\. @@ -194,16 +154,11 @@ For a list of embedded parameters that each of the events may use, see the follo ### Basket event The Basket event can be used to add products to a user's shopping cart. -This event is especially valuable if anonymized checkout is allowed or no recurring -user identification is possible. -By using the shopping cart products as input for getting recommendations, problems -with an empty profile or no buy history for the user can be solved. -The more valuable Basket events instead of recent user clicks can be used to provide -personalized recommendations. -It also happens quite often that users "store" products on their shopping [wishlist](#wishlist-event) -and plan to buy them later. -With the help of this information, personalized shopping cart-based recommendations -can be provided in the whole shop. +This event is especially valuable if anonymized checkout is allowed or no recurring user identification is possible. +By using the shopping cart products as input for getting recommendations, problems with an empty profile or no buy history for the user can be solved. +The more valuable Basket events instead of recent user clicks can be used to provide personalized recommendations. +It also happens quite often that users "store" products on their shopping [wishlist](#wishlist-event) and plan to buy them later. +With the help of this information, personalized shopping cart-based recommendations can be provided in the whole shop. `GET https://event.perso.ibexa.co/api/[customerid]/basket/[userid]/[itemtypeid]/[itemid]` @@ -212,9 +167,7 @@ This event has no query string parameters. ### Blacklist event -If a website offers a link or button that allows feedback similar to "don't -recommend this product to me anymore", a user could express that they have bought -it already in another shop. +If a website offers a link or button that allows feedback similar to "don't recommend this product to me anymore", a user could express that they have bought it already in another shop. The format of the URL is: @@ -226,59 +179,48 @@ This event has no query string parameters.  ### Buy event As the name suggests, this event is used when an end user buys an item. -It must be sent to the event tracker at the end of a successful check-out process -to ensure that no further action of the user can result in an abort. +It must be sent to the event tracker at the end of a successful check-out process to ensure that no further action of the user can result in an abort. The URL has the following format:  `GET https://event.perso.ibexa.co/api/[customerid]/buy/[userid]/[itemtypeid]/[itemid]?fullprice=2.50EUR&quantity=4` For a detailed description of embedded parameters, see [event parameters](#event-parameters). -In addition to the fact that an item is bought, this event should provide information -about the product price and quantity. +In addition to the fact that an item is bought, this event should provide information about the product price and quantity. |Name|Description|Values| |---|---|---| |`quantity`|The number of products a user has bought. Default value is "1". You can send n events instead of setting this parameter to n. This parameter is optional.|integer (default is "1")| |`fullprice`|A price for a single product. It contains the price in decimal format plus the currency ISO 4217 code. If the price has a decimal part, the point must be used. There can be no space between price and currency. This parameter is optional.|currency, for example "12.45EUR" or "456JPY"| -For example, if a user bought 4 pens for 10 Euros, `fullprice` can be set to "2.50EUR" -and `quantity` can be set to 4. +For example, if a user bought 4 pens for 10 Euros, `fullprice` can be set to "2.50EUR" and `quantity` can be set to 4. The Buy event is only relevant if the user is charged per product, like in a classic shop. -If products are sold on a subscription basis, or the web presence is ad-sponsored, -this event type isn't applicable. +If products are sold on a subscription basis, or the web presence is ad-sponsored, this event type isn't applicable. #### Prices in a Buy event Every Buy event can contain a price. -If the price is set, it's stored with the event and used for calculating the -revenue for statistics. +If the price is set, it's stored with the event and used for calculating the revenue for statistics. The price must be a price the user paid for the item, including all taxes and discounts.  -If product price filtering is activated, the information provided over the product -import is used. +If product price filtering is activated, the information provided over the product import is used. For more information, see [Content API](content_api.md). -The currency is stored with the price and normalized only when statistic information -is requested. -it's often a good choice to select a base currency and convert prices before -sending the buy event. -The price attached to a buy event never overwrites the price which was defined -in an item import. +The currency is stored with the price and normalized only when statistic information is requested. +it's often a good choice to select a base currency and convert prices before sending the buy event. +The price attached to a buy event never overwrites the price which was defined in an item import. ### Click event When the end user opens an item/article detail, a Click events is sent. -The Click event often provides additional information about the category -structure of the website. +The Click event often provides additional information about the category structure of the website. !!! note User IDs aren't stored in the database. - they're irreversibly anonymized before saving to disk or building the - recommendation model. + they're irreversibly anonymized before saving to disk or building the recommendation model. The URL to track user clicks has the following format: @@ -302,7 +244,7 @@ Some optional request parameters can be set over query string parameters (GET pa For eCommerce stores, this event isn't required but can be used in custom implementations. The event is sent when the end user stays on the page for a predefined period of time. -it's then assumed that the user consumed the item (read an article or watched a video). +It's then assumed that the user consumed the item (read an article or watched a video). The URL has the following format: @@ -316,24 +258,17 @@ The following table lists the request parameters: |`percentage`|Informs how much of an item was consumed, for example, that an article was read only in 20%, a movie was watched in 90% or someone finished 3/4 of all levels of a game.|0-100| The logic for calculating the percentage is defined by the implementation. -For articles, this could be by scrolling down, for a movie/video based on the -consumption part.  +For articles, this could be by scrolling down, for a movie/video based on the consumption part.  You must decide what 100% consumption means. For example, a movie contains end titles that are almost never consumed. Therefore, they should not be part of the percentage calculation. -The simplest implementation for articles is a JavaScript timer, which sends this -event after a predefined time has elapsed (and the user did not leave the page). -The timespan after that the event is triggered should be dependent on the content, -for example, it could be 30 seconds for a small newspaper article or a timespan -calculated by the amount of words. +The simplest implementation for articles is a JavaScript timer, which sends this event after a predefined time has elapsed (and the user did not leave the page). +The timespan after that the event is triggered should be dependent on the content, for example, it could be 30 seconds for a small newspaper article or a timespan calculated by the amount of words. !!! note "Incremental tracking of consume events" - Consume events for a user can be sent incrementally as the recommender uses - only the highest percentage rate. For example, if a user watches a movie, - the website could send Consume events in 10% steps to avoid losing tracking - information when the browser window is forcibly closed. + Consume events for a user can be sent incrementally as the recommender uses only the highest percentage rate. For example, if a user watches a movie, the website could send Consume events in 10% steps to avoid losing tracking information when the browser window is forcibly closed. ### Deletefrombasket event @@ -359,19 +294,13 @@ This event has no query string parameters.  ### Login event -Recommendations rely on the fact that user actions can be correlated over a longer -period of time. -Moreover, recommendations similar to "users who viewed this product ultimately -bought it" require correlating Click events with subsequent Buy events. -In general, users tend to browse a website anonymously and add products to their -shopping cart. -Up to this point, a user is identified by a visit-scoped variable (for example, -a session ID or a first party cookie). +Recommendations rely on the fact that user actions can be correlated over a longer period of time. +Moreover, recommendations similar to "users who viewed this product ultimately bought it" require correlating Click events with subsequent Buy events. +In general, users tend to browse a website anonymously and add products to their shopping cart. +Up to this point, a user is identified by a visit-scoped variable (for example, a session ID or a first party cookie). During the check-out of the shopping cart, a user probably logs in to an existing account. -As a result, the user identifier changes from an anonymous visit-scoped ID -(sourceuserid) to a pseudonymous, persistent account ID (targetuserid). -You should correlate both IDs to correlate the Buy events (account ID) with -the preceding Click events (visit-scoped ID). +As a result, the user identifier changes from an anonymous visit-scoped ID (sourceuserid) to a pseudonymous, persistent account ID (targetuserid). +You should correlate both IDs to correlate the Buy events (account ID) with the preceding Click events (visit-scoped ID). The Login event serves exactly this purpose. The format of the URL is:  @@ -383,8 +312,7 @@ For a detailed description of embedded parameters, see [event parameters](#event ### Rate event Publishers, media or shops often allow commenting/rating products, articles or movies. -If a user comments on an item, it indicates a special interest in this topic that has -to be treated separately. +If a user comments on an item, it indicates a special interest in this topic that has to be treated separately. The format of the URL is: @@ -409,8 +337,7 @@ It can also be used as a basis for the price drop trigger. `GET https://event.perso.ibexa.co/api/[customerid]/wishlist/[userid]/[itemtypeid]/[itemid]?price=2.50EUR` For a detailed description of embedded parameters, see [event parameters](#event-parameters). -In addition to the fact that an item is placed on the shopping list, this event can provide information -about the product price at the time it was saved. +In addition to the fact that an item is placed on the shopping list, this event can provide information about the product price at the time it was saved. |Name|Description| |---|---| @@ -418,20 +345,15 @@ about the product price at the time it was saved. ## Tracking events based on recommendations -Tracking events based on integrated recommendations are the only way to measure the accuracy -and effectiveness of recommendations. +Tracking events based on integrated recommendations are the only way to measure the accuracy and effectiveness of recommendations. Both recommendation response and trigger message include requests to generate these events. -Events of this type inform the Personalization server about the recommendations that -were shown to the user and which of those recommendations were clicked. -Otherwise, it would be impossible to calculate reliable statistics that could be checked -against the customer's KPIs. +Events of this type inform the Personalization server about the recommendations that were shown to the user and which of those recommendations were clicked. +Otherwise, it would be impossible to calculate reliable statistics that could be checked against the customer's KPIs. A recommendation response includes requests to generate a Rendered and Clickrecommended event. The first one is executed when a recommendation is shown to the user. The second is called when a recommendation is clicked or otherwise accepted. -Sending Rendered events causes as many requests as recommendations to be displayed, -a Clickrecommended event is usually sent only once (when a user clicks on -a specific recommendation item). +Sending Rendered events causes as many requests as recommendations to be displayed, a Clickrecommended event is usually sent only once (when a user clicks on a specific recommendation item). Example of a recommendation response: @@ -493,11 +415,8 @@ For more information, see [Send messages with recommendations](../integrate_reco ### Rendered event -This event is sent when the website uses the recommendation provided by the recommendation -engine and renders it on the webpage. -In combination with a predefined threshold, it allows the recommender engine to -exclude this item from future results and avoid recommending the same item to the -same user multiple times during a session. +This event is sent when the website uses the recommendation provided by the recommendation engine and renders it on the webpage. +In combination with a predefined threshold, it allows the recommender engine to exclude this item from future results and avoid recommending the same item to the same user multiple times during a session. The URL for a Rendered event has the following format: @@ -505,14 +424,13 @@ The URL for a Rendered event has the following format: For a detailed description of embedded parameters, see [event parameters](#event-parameters). -it's common that recommendations are rendered as a block with multiple items. +It's common that recommendations are rendered as a block with multiple items. To save traffic and speed up the process, you can bundle multiple recommendations in one request. Several item IDs must be comma-separated. ### Clickrecommended event -When the end users clicks a recommendation, the following event is sent -to gather statistics related to the acceptance of recommendations. +When the end users clicks a recommendation, the following event is sent to gather statistics related to the acceptance of recommendations. The URL has the following format: @@ -525,12 +443,10 @@ The request parameters are: |---|---|---| |`scenario`|Name of the scenario, where recommendations originated from. This parameter is required.|URL-encoded alphanumeric| -The scenario parameter identifies the originating scenario to gain detailed statistics -about the scenario that motivated the user to click on a recommendation. +The scenario parameter identifies the originating scenario to gain detailed statistics about the scenario that motivated the user to click on a recommendation. This information comes with the recommendation from the recommendation controller.  -The event is used for providing statistics about how often users accepted the recommendations of -the configured recommendation scenario or considered them as valuable. +The event is used for providing statistics about how often users accepted the recommendations of the configured recommendation scenario or considered them as valuable. ### Triggeropened event @@ -597,13 +513,11 @@ User "Js79009234YU7" puts products 128 and 129 into the cart. `GET https://event.perso.ibexa.co/api/00000/basket/Js79009234YU7/1/129` -To buy selected products, user "Js79009234YU7" logs in and obtains an internal -identifier (for example, the registration ID) "johndoe" from the site. +To buy selected products, user "Js79009234YU7" logs in and obtains an internal identifier (for example, the registration ID) "johndoe" from the site. `GET https://event.perso.ibexa.co/api/00000/login/Js79009234YU7/johndoe` -The user buys two products from the cart: product 128 (one piece for the price - of EUR 19.99) and product 129 (2 pieces for the price of EUR 4.44 each). +The user buys two products from the cart: product 128 (one piece for the price of EUR 19.99) and product 129 (2 pieces for the price of EUR 4.44 each). `GET https://event.perso.ibexa.co/api/00000/buy/johndoe/1/128?quantity=1&fullprice=19.99EUR` `GET https://event.perso.ibexa.co/api/00000/buy/johndoe/1/129?quantity=2&fullprice=4.44EUR` diff --git a/docs/personalization/api_reference/user_api.md b/docs/personalization/api_reference/user_api.md index 991d46ec42..710baa385a 100644 --- a/docs/personalization/api_reference/user_api.md +++ b/docs/personalization/api_reference/user_api.md @@ -4,19 +4,18 @@ description: Use HTTP methods to correlate metadata with user data and combine u # User API -When generating recommendations, it's useful to have the ability to correlate metadata -with user data and combine users into clusters of certain type. -Such metadata can be gender, ZIP code, discount rate, etc.  -You can use the following user metadata import format to enrich the tracked data with information that cannot be calculated and must be provided by the end-user. +When generating recommendations, it's useful to have the ability to correlate metadata with user data and combine users into clusters of certain type. +Such metadata can be gender, ZIP code, discount rate, and more.  +You can use the following user metadata import format to enrich the tracked data with information that cannot be calculated and must be provided by the end-user. If you plan to import user metadata, contact support@ibexa.co to ensure that you're compliant with privacy regulations. !!! note "Authentication" For importing metadata, basic authentication is enabled by default. - Use your customer ID and license key as username and password. + Use your customer ID and license key as username and password. If authentication is enabled for recommendation requests and you want change this, contact support@ibexa.co. - + ## GET requests Use the following request to fetch user attributes for the specified users: @@ -40,21 +39,16 @@ For the requests to function, you must provide the following parameters: |---|---|---| |`customerid`|A customer ID (for example "00000"), as defined when [enabling Personalization](enable_personalization.md#set-up-customer-credentials). Can be used to identify a website in installations that [hosts multiple SiteAccesses]([[= user_doc =]]/personalization/use_cases/#multiple-website-hosting).|alphanumeric| |`source`|An ID of the source of the specified user's metadata.|alphanumeric| -|`userid`|An ID of the tracked user in the website (for example, an internal customer code, a session code or a cookie for anonymous users.|alphanumeric| - +|`userid`|An ID of the tracked user in the website (for example, an internal customer code, a session code, or a cookie for anonymous users.|alphanumeric| + !!! caution "Parameter encoding limitations" - All parameters must be URL-encoded (see RFC 3986) and cannot contain slash, backslash or space - characters. - + All parameters must be URL-encoded (see RFC 3986) and cannot contain slash, backslash or space characters. + ##### Source -The `source` parameter defines the system that stores the specified user's metadata. -If you have multiple source systems for updating user attributes, -for example, a registration service, where users define their gender and age, -or an application that integrates with Facebook to source the brands the user "liked" in your shop, -every new upload of attributes replaces the attribute set that already exists -for the same user/source pair. +The `source` parameter defines the system that stores the specified user's metadata. +If you have multiple source systems for updating user attributes, for example, a registration service, where users define their gender and age, or an application that integrates with Facebook to source the brands the user "liked" in your shop, every new upload of attributes replaces the attribute set that already exists for the same user/source pair. If you need to get all the available attributes for all sources, apply the `allSources` query string parameter, for example: @@ -78,14 +72,14 @@ For example: ## DELETE request Use the following request to run an opt-out option to delete the user and all data related to this user. After this request, the user is deleted from the database. - + `DELETE: https://admin.perso.ibexa.co/api/[customerid]/user/[userid[,userid[...]]]` ## Responses ### Response object format -For an example of user metadata, see the following XML code. +For an example of user metadata, see the following XML code. The attribute keys and values are chosen at random. ``` xml diff --git a/docs/personalization/attribute_search_in_elasticsearch.md b/docs/personalization/attribute_search_in_elasticsearch.md index f3ab56b7c7..01c2b6a710 100644 --- a/docs/personalization/attribute_search_in_elasticsearch.md +++ b/docs/personalization/attribute_search_in_elasticsearch.md @@ -4,7 +4,8 @@ description: Attribute search uses Elasticsearch database to display dynamically # Attribute search in Elasticsearch database -If you use external data source for personalization data, it's not possible to display external content in the Universal Discovery Widget as it's deprecated. Attribute search is used in scenario preview and editorials models instead. +If you use external data source for personalization data, it's not possible to display external content in the Universal Discovery Widget as it's deprecated. +Attribute search is used in scenario preview and editorials models instead. Attribute search works like an autocomplete feature, but values are dynamically taken from the Elasticsearch database. ## Configure attribute search @@ -18,7 +19,7 @@ ibexa: personalization: output_type_attributes: : - title: + title: ``` @@ -41,7 +42,7 @@ ibexa: title: short_name description: body image: image - + ``` ![Attributes search](perso_attributes_search.png) diff --git a/docs/personalization/enable_personalization.md b/docs/personalization/enable_personalization.md index 5af31b397f..4ff3d08e14 100644 --- a/docs/personalization/enable_personalization.md +++ b/docs/personalization/enable_personalization.md @@ -8,14 +8,12 @@ To enable it, you must set up authentication parameters that you receive from [[ ## Get authentication parameters -First, either you or another [[= product_name_base =]] user responsible for managing the [[= product_name =]] -instance must [request access to the service]([[= user_doc =]]/personalization/enabling_personalization/#request-access-to-the-server). +First, either you or another [[= product_name_base =]] user responsible for managing the [[= product_name =]] instance must [request access to the service]([[= user_doc =]]/personalization/enabling_personalization/#request-access-to-the-server). ## Set up customer credentials When you receive the credentials, add them to your configuration. -In the root folder of your project, edit either the `.env` or `.env.local` file -by adding the following lines with your customer ID and license key: +In the root folder of your project, edit either the `.env` or `.env.local` file by adding the following lines with your customer ID and license key: ``` PERSONALIZATION_CUSTOMER_ID=12345 @@ -25,17 +23,15 @@ PERSONALIZATION_HOST_URI=https://server_uri !!! note "Configuring user credentials for different customers" - If your installation [hosts multiple sites]([[= user_doc =]]/personalization/use_cases/#multiple-website-hosting) with different - customer IDs, for example, to provide separate recommendations for different - language versions of the store, you can store all credentials in the same file: - + If your installation [hosts multiple sites]([[= user_doc =]]/personalization/use_cases/#multiple-website-hosting) with different customer IDs, for example, to provide separate recommendations for different language versions of the store, you can store all credentials in the same file: + ``` # Main credentials - ENU store PERSONALIZATION_CUSTOMER_ID=12345 PERSONALIZATION_LICENSE_KEY=67890-1234-5678-90123-4567 PERSONALIZATION_HOST_URI=https://server_uri - # Additional credentials - FRA store + # Additional credentials - FRA store FRA_CUSTOMER_ID=54321 FRA_LICENSE_KEY=09876-5432-1098-7654-3210 FRA_HOST_URI=https://FRA_server_uri @@ -45,29 +41,22 @@ PERSONALIZATION_HOST_URI=https://server_uri ## Configure Personalization -The [Personalization package](https://github.com/ibexa/personalization-client) -adds a personalization solution to [[= product_name =]] and communicates with -the Personalization server. +The [Personalization package](https://github.com/ibexa/personalization-client) adds a personalization solution to [[= product_name =]] and communicates with the Personalization server. -Its job is to track the way visitors use the website and recommend content -based on their behavior. +Its job is to track the way visitors use the website and recommend content based on their behavior. For more information about integrating the Personalization service, see [Developer guide](tracking_api.md) and [Best practices](tracking_integration.md). ### Set up item type tracking -For the recommendations to be calculated, apart from visitor events (CLICK, BUY, etc.), -the Personalization server must receive a list of item types that are tracked. +For the recommendations to be calculated, apart from visitor events (CLICK, BUY, etc.), the Personalization server must receive a list of item types that are tracked. You define item types to be tracked in [configuration files](configuration.md#configuration-files). The content is then initially exported by a script. -After this, it's synchronized with the Personalization service every time a change -occurs (using any method that triggers the event). +After this, it's synchronized with the Personalization service every time a change occurs (using any method that triggers the event). The Personalization configuration is SiteAccess-aware. -If your installation hosts multiple sites with different customer IDs, -for example, to provide separate recommendations for different language versions -of the site, provide the credentials that correspond to each of the sites. +If your installation hosts multiple sites with different customer IDs, for example, to provide separate recommendations for different language versions of the site, provide the credentials that correspond to each of the sites. The configuration can resemble the following example: @@ -87,7 +76,7 @@ ibexa: title: 'title' image: 'image_legend' description: 'sub_title' - 456: + 456: title: 'short_title' image: 'primary_image' description: 'sub_title' @@ -105,7 +94,7 @@ ibexa: title: 'title' image: 'image_legend' description: 'sub_title' - 456: + 456: title: 'short_title' image: 'primary_image' description: 'sub_title' @@ -113,10 +102,9 @@ ibexa: !!! note "Authentication" - For data exchange purposes, basic authentication is enabled by default. + For data exchange purposes, basic authentication is enabled by default. To change this, contact support@ibexa.co. - For security reasons, [store the authentication credentials in the ENV file](#set-up-customer-credentials), - and don't commit them to the Version Control System. + For security reasons, [store the authentication credentials in the ENV file](#set-up-customer-credentials), and don't commit them to the Version Control System. Then, use environment variables to pull them into the YAML file. | Parameter | Description | @@ -142,8 +130,7 @@ ibexa: #### Enable tracking -The Personalization client bundle delivers a Twig extension -which helps integrate the user tracking functionality into your site. +The Personalization client bundle delivers a Twig extension which helps integrate the user tracking functionality into your site. Place the following code snippet in the `` section of your header template: ``` html+twig @@ -163,8 +150,7 @@ As the API uses token based authorization you first need a valid bearer token. When you publish a content item a bearer token is created and saved to the `ibexa_token` db table. -Additionally a POST request is send to the Personalization Engine, containing the token -and the Rest URL where the Personalization Engine can fetch the changed Content. +Additionally a POST request is send to the Personalization Engine, containing the token and the Rest URL where the Personalization Engine can fetch the changed Content. The `BEARER_TOKEN` is the newest one in `ibexa_token` table having `type=1` and `identifier=update`. The token has a default lifetime of one day. @@ -231,8 +217,7 @@ The `content` endpoint returns one item and the `contentlist` endpoint returns m To get recommendations you must first export the item information to the Personalization server. -After you [define item types to be tracked and recommended](#set-up-item-type-tracking), -start the full export. +After you [define item types to be tracked and recommended](#set-up-item-type-tracking), start the full export. You need to run the `ibexa:personalization:run-export command per SiteAccesses that you want to use together with Personalization. You need different customer IDs for different SiteAccesses. @@ -245,12 +230,9 @@ php bin/console ibexa:personalization:run-export --languages=, ``` -The bundle exporter collects all content related to the ``/`` -pair and stores it in files to the folder `public/var/export/yyyy/mm/dd/hh/mm` of your project. -After finishing, the system sends a POST request to the endpoint and informs the -Personalization server to fetch new content. -An internal workflow is then triggered, so that the generated files are downloaded -and imported in the Personalization server's content store. +The bundle exporter collects all content related to the ``/`` pair and stores it in files to the folder `public/var/export/yyyy/mm/dd/hh/mm` of your project. +After finishing, the system sends a POST request to the endpoint and informs the Personalization server to fetch new content. +An internal workflow is then triggered, so that the generated files are downloaded and imported in the Personalization server's content store. The export process can take several minutes. @@ -258,8 +240,7 @@ The export process can take several minutes. !!! caution "Re-exporting modified item types" - If the item types to be recommended change, you must perform a new full export - by running the `php bin/console ibexa:personalization:run-export` command again. + If the item types to be recommended change, you must perform a new full export by running the `php bin/console ibexa:personalization:run-export` command again. #### Check export results @@ -277,7 +258,7 @@ To get the data of an imported item you can request the following REST resource: `GET https://admin.perso.ibexa.co/api//item//` -This way uses basic authentication. +This way uses basic authentication. The username is the customer ID and the password is the license key. ??? note "Example response" @@ -331,10 +312,8 @@ In the back office, go to **Personalization** > **Import** and review the list o The Personalization server is automatically kept in sync with the content in [[= product_name =]]. -Every time an editor creates, updates or deletes content in the back office, -a notification is sent to https://admin.perso.ibexa.co/. -The personalization service also notifies other components of the Personalization server -and it eventually fetches the affected content and updates it internally. +Every time an editor creates, updates or deletes content in the back office, a notification is sent to https://admin.perso.ibexa.co/. +The personalization service also notifies other components of the Personalization server and it eventually fetches the affected content and updates it internally. ![Subsequent content exports](incremental_content_export.png) @@ -342,14 +321,10 @@ and it eventually fetches the affected content and updates it internally. !!! note "Client-based recommendations" - Recommendations are fetched and rendered asynchronously, so there - is no additional load on the server. - Therefore, it's crucial that you check whether the content export was successful, - because certain references, for example, deeplinks and image references, are - included. + Recommendations are fetched and rendered asynchronously, so there is no additional load on the server. + Therefore, it's crucial that you check whether the content export was successful, because certain references, for example, deeplinks and image references, are included. If the export fails, the Personalization server doesn't have full content information. - As a result, even if the recommendations are displayed, they might miss images, - titles or deeplinks. + As a result, even if the recommendations are displayed, they might miss images, titles or deeplinks. To display recommendations on your site, you must include the asset in the template using the following code: @@ -374,8 +349,7 @@ render(controller('ibexa_personalization::showRecommendationsAction', { !!! tip - To check whether tracking is enabled on the front end, use the - `ibexa_recommendation_enabled()` Twig function. + To check whether tracking is enabled on the front end, use the `ibexa_recommendation_enabled()` Twig function. You can wrap the call to the `RecommendationController` with: ``` html+twig @@ -402,21 +376,18 @@ You can also bypass named arguments with standard value passing as arguments. !!! note "Custom templates" - To use a custom template for displaying recommendations, - ensure that it includes `event_tracking.html.twig`: + To use a custom template for displaying recommendations, ensure that it includes `event_tracking.html.twig`: `{% include '@IbexaPersonalization/event_tracking.html.twig' %}`. -Recommendation responses contain all content data that is requested as attribute -in the recommendation call. +Recommendation responses contain all content data that is requested as attribute in the recommendation call. This response data can be used in templates to render and style recommendations. -For example, the following GET request should deliver the response below -if the content fields were previously exported by the export script. +For example, the following GET request should deliver the response below if the content fields were previously exported by the export script. `GET https://reco.perso.ibexa.co/api/v2//someuser/popular.json?contextitems=71&numrecs=5&categorypath=/&outputtypeid=&attribute=name,author,uri,image` -??? note "Example response" +!!! note "Example response" ``` json { @@ -507,8 +478,7 @@ if the content fields were previously exported by the export script. #### Modify recommendation data -You can retrieve data returned from the Personalization server and modify it -before it's shown to the user. +You can retrieve data returned from the Personalization server and modify it before it's shown to the user. To modify recommendation data, subscribe to `RecommendationResponseEvent`. See [`Event/Subscriber/RecommendationEventSubscriber.php`](https://github.com/ibexa/personalization-client/blob/main/src/lib/Event/Subscriber/RecommendationEventSubscriber.php) for an example: @@ -522,18 +492,15 @@ public static function getSubscribedEvents(): array } ``` -The `-10` refers to priority, which must be negative so this action is performed -before the main subscriber is run. +The `-10` refers to priority, which must be negative so this action is performed before the main subscriber is run. ### Image variations Displaying image variations isn't supported out of the box. -You can work around this limitation by creating a template -(based on [recommendations.html.twig](https://github.com/ibexa/personalization-client/blob/main/src/bundle/Resources/views/recommendations.html.twig)). +You can work around this limitation by creating a template (based on [recommendations.html.twig](https://github.com/ibexa/personalization-client/blob/main/src/bundle/Resources/views/recommendations.html.twig)). -To access a specific image variation through API, add the `image` parameter to the -request URL with the name of the variation as its value. +To access a specific image variation through API, add the `image` parameter to the request URL with the name of the variation as its value. For example, to retrieve the `rss` variation of the image, use: `/api/ezp/v2/ibexa_recommendation/v1/contenttypes/16?lang=eng-GB&fields=title,description,image,intro,name&page=1&page_size=20&image=rss` @@ -559,12 +526,8 @@ You can replace `info` with `debug` to increase verbosity. ## Set up user roles and permissions -Depending on your requirements, you may need to set up `edit` and `view` [permissions](permissions.md) -to grant users access to recommendation settings that relate to different SiteAccesses -and results that come from these websites. +Depending on your requirements, you may need to set up `edit` and `view` [permissions](permissions.md) to grant users access to recommendation settings that relate to different SiteAccesses and results that come from these websites. ## Configure recommendation logic -When you enable the Personalization, you can go back to the back office, -refresh the Personalization dashboard and proceed with [configuring the logic]([[= user_doc =]]/personalization/perso_configuration) -used to calculate the recommendation results. +When you enable the Personalization, you can go back to the back office, refresh the Personalization dashboard and proceed with [configuring the logic]([[= user_doc =]]/personalization/perso_configuration) used to calculate the recommendation results. diff --git a/docs/personalization/importing_historical_user_tracking_data.md b/docs/personalization/importing_historical_user_tracking_data.md index 987732cef6..2617bdc13a 100644 --- a/docs/personalization/importing_historical_user_tracking_data.md +++ b/docs/personalization/importing_historical_user_tracking_data.md @@ -5,20 +5,15 @@ description: Use historical user tracking data to build user profiles and genera # Importing historical user tracking data The recommendation engine supports replaying historical user events by adding a special parameter *overridetimestamp* on the buy event to simulate the event date. -This is then used as the datetime of an event instead of the current timestamp -of the request. +This is then used as the datetime of an event instead of the current timestamp of the request. -To give an example: it's often requested to import the buy history of users -to avoid the cold start problem and being able to start with good recommendations. -Instead of waiting till the user profile is built by collecting events from the day, -you implemented the tracking. -Usually a curl input file is generated which creates buy requests that are sent -to the tracking endpoint. +To give an example: it's often requested to import the buy history of users to avoid the cold start problem and being able to start with good recommendations. +Instead of waiting till the user profile is built by collecting events from the day, you implemented the tracking. +Usually a curl input file is generated which creates buy requests that are sent to the tracking endpoint. !!! note "User identifiers" - Ensure that user identifiers used in an import file are the same that - are used in the live tracking, for example, the user login identifiers. + Ensure that user identifiers used in an import file are the same that are used in the live tracking, for example, the user login identifiers. There must be some validation to avoid importing buy events by any user. Therefore a signature parameter needs to be added, which is calculated like the following: @@ -28,12 +23,10 @@ Therefore a signature parameter needs to be added, which is calculated like the !!! caution "Parameters without a value" The order of the parameters to be signed is crucial. - They must be sent in alphabetical order based on the parameter names to create - a signature. + They must be sent in alphabetical order based on the parameter names to create a signature. Encodings must always contain capital letters (for example, %3A and not %3a). - If a parameter value is "" or "null" or "undefined" it needs to be excluded from - the signing and must not be sent in the query string. + If a parameter value is "" or "null" or "undefined" it needs to be excluded from the signing and must not be sent in the query string. **valid**: `https://event.perso.ibexa.co/api/00000/buy/johndoe/1/11?fullprice=19.99EUR&overridetimestamp=2012-01-01T11%3A00%3A00&quantity=1&signature=d0026f017ae823f19530d93318c5a2f6` @@ -41,8 +34,7 @@ Therefore a signature parameter needs to be added, which is calculated like the ## Example -With a license key of "8695-1828-92810-5535-4239" and a purchase of certain -products, there can be the following signature values: +With a license key of "8695-1828-92810-5535-4239" and a purchase of certain products, there can be the following signature values: ``` https://event.perso.ibexa.co/api/00000/buy/johndoe/1/11?fullprice=19.99EUR&overridetimestamp=2012-01-01T11%3A00%3A00&quantity=1&signature=d0026f017ae823f19530d93318c5a2f6 diff --git a/docs/personalization/integrate_recommendation_service.md b/docs/personalization/integrate_recommendation_service.md index 4b9613ffcb..9c38003577 100644 --- a/docs/personalization/integrate_recommendation_service.md +++ b/docs/personalization/integrate_recommendation_service.md @@ -5,8 +5,7 @@ description: Integrate recommendation service into your website. # Integrate recommendation service To return recommendations, you must first [enable the Personalization service](enable_personalization.md). -Next, integrate the service with [[= product_name =]] by activating -event tracking and embedding recommendation results into the website. +Next, integrate the service with [[= product_name =]] by activating event tracking and embedding recommendation results into the website. !!! note @@ -16,18 +15,15 @@ event tracking and embedding recommendation results into the website. ## Track events The service primarily relies on event tracking. -For the events to be registered, every content item or product page must call -a special tracking URL. -The easiest way of embedding the tracking URL is placing a one pixel image on every page, -like in the case of analytical tools or visitor counters. +For the events to be registered, every content item or product page must call a special tracking URL. +The easiest way of embedding the tracking URL is placing a one pixel image on every page, like in the case of analytical tools or visitor counters. A code that includes an image looks like this: `` where: -- `` stands either for the user ID or session ID of the user who is currently -logged into your website (any URL-encoded string is allowed). +- `` stands either for the user ID or session ID of the user who is currently logged into your website (any URL-encoded string is allowed). - `` stands for the [contentTypeId](content_model.md#content-information) of the content item or product that you want to track and recommend. @@ -214,9 +210,7 @@ The object contains links to the recommended items (`triggerOpenedLink`, `clickR ## Advanced integration -You can configure integration at a more advanced level to track more events, -use additional parameters, apply custom scenario configurations, filters, -and enable additional features. +You can configure integration at a more advanced level to track more events, use additional parameters, apply custom scenario configurations, filters, and enable additional features. For more information about available functionalities, see [User Documentation]([[= user_doc =]]/personalization/personalization). diff --git a/docs/personalization/legacy_recommendation_api.md b/docs/personalization/legacy_recommendation_api.md index 7afe65f3d1..9625bd28ca 100644 --- a/docs/personalization/legacy_recommendation_api.md +++ b/docs/personalization/legacy_recommendation_api.md @@ -6,34 +6,27 @@ description: An old method of fetching recommendations from the system using rec !!! caution - This is a page describing the old version of the recommendation API. + This is a page describing the old version of the recommendation API. It's available for reference purposes only. Use the new [Recommendation API](recommendation_api.md) instead. -This page describes how to fetch recommendations from the Recommender System through -recommendation requests. -Before recommendation can be fetched from the recommendation controller, a sufficient -number of events must be collected and the model build must finish successfully. +This page describes how to fetch recommendations from the Recommender System through recommendation requests. +Before recommendation can be fetched from the recommendation controller, a sufficient number of events must be collected and the model build must finish successfully. !!! note - **BASIC Authentication** for fetching recommendations is enabled for some - configurations (for example for Gambio Plugin) by default. + **BASIC Authentication** for fetching recommendations is enabled for some configurations (for example for Gambio Plugin) by default. Use the `customerid` as username and the license key as password. - The license key is displayed in the upper right in the [Admin GUI](https://admin.yoochoose.net/)) - after you log in with your registration credentials. + The license key is displayed in the upper right in the [Admin GUI](https://admin.yoochoose.net/)) after you log in with your registration credentials. - If you plan to use [JSONP](https://www.w3schools.com/js/js_json_jsonp.asp), authentication - must be disabled. + If you plan to use [JSONP](https://www.w3schools.com/js/js_json_jsonp.asp), authentication must be disabled. If it's enabled in your solution (can be easily tested with a recommendation request in a browser), please contact the eZ Recommender support () for further information and disabling. ## Getting recommendations -Recommendations are retrieved from the Personalization server with RESTful requests -by using the GET method. -The result is a list of item IDs that can be used to call the underlying CMS -or shop system, to retrieve the necessary information for the rendering process. +Recommendations are retrieved from the Personalization server with RESTful requests by using the GET method. +The result is a list of item IDs that can be used to call the underlying CMS or shop system, to retrieve the necessary information for the rendering process. To allow the customer to retrieve different types of recommendations based on different methods (for example, Collaborative Filtering, Content Based, Stereotype, etc.) the Recommendation System uses scenario IDs relating to a predefined set of configurations inside the system. These configurations are a combination of methods and filters that should be applied including possible fallbacks if the requested methods don't deliver a result. @@ -77,7 +70,7 @@ It fetches 8 recommendations for user Smith, who is watching the item 123 and th ## Response handling The recommendation request returns a list of item IDs that are JSON, JSONP or XML-formatted. -The result can be easily integrated into any webpage by using some lines of script code.  +The result can be integrated into any webpage by using some lines of script code.  !!! tips @@ -156,11 +149,11 @@ The format of error messages can be changed and should not be used for automated ## Advanced Request Parameter -There are some additional very special request parameters. +There are some additional special request parameters. ###### any attribute name (used only if submodels are configured) -Item's attribute, for example, color, price, etc. +Item's attribute, for example, color, price, and more. These are customer specific and can only be understood by the recommender system if the item attributes are imported by using the YOOCHOOSE content import APIs. There can be multiple attributename and attributevalue pairs. @@ -212,16 +205,22 @@ Recommendation service support following HTTP headers to allow cache control on |Response|`Last-Modified`|The last modification date of the recommendations.|`Last-Modified: Tue, 15 Nov 2013 12:45:26 GMT`|-| ||`Expires`|Gives the date/time after which the response is considered to be outdated|`Expires: Thu, 01 Dec 2013 16:00:00 GMT`|-| -The last modification timestamp indicates a change that could influence the recommendation response. It depends on an updated recommendation calculation, an update of an item or some scenario configuration changes. The expiration timestamp is a best-effort prediction based on the model building configuration and provided context. The shortest expiration period is 5 minutes from the request time. The longest is 24 hours. In the table below several examples are illustrated: +The last modification timestamp indicates a change that could influence the recommendation response. +It depends on an updated recommendation calculation, an update of an item or some scenario configuration changes. +The expiration timestamp is a best-effort prediction based on the model building configuration and provided context. +The shortest expiration period is 5 minutes from the request time. The longest is 24 hours. +In the table below several examples are illustrated: | Model | Context | Expiration time | Description | |------|------|-----|-----| -| Bestselling products last 7 days | no context | 24 hours | The model with the 7 days scope is usually built once a day. It can be easily cached for 24 hours. It has no context and can therefore be cached globally for all the users of a customer. | +| Bestselling products last 7 days | no context | 24 hours | The model with the 7 days scope is usually built once a day. It can be cached for 24 hours. It has no context and can therefore be cached globally for all the users of a customer. | | Also bought products in the last month | current product | 24 hours | The model with the 30 days scope is usually built once a day. The context is always the same. It can be cached for every product. The same result can be used for all users of a customer. | | Also consumed read articles in the last hour | current article | 30 minutes | Models with a short scope are usually built several times a day or even per hour. In this case the expiration time is set to the half of the model build frequency/period. | | Personalized recommendation based on the user's statistic | customers click history | now | Although the statistic model isn't updated within minutes, it's very likely that the context is changed shortly (customer clicks another product and therefore the click is added to his history). The expiration time should not be much longer than the user activity on the web page. | -In most cases you don't need to calculate the expiration time manually. The table above is provided for the orientation, how the Expires header of the HTTP response is calculated by the recommendation engine and already provided to your caching system. You just need to make sure that the Expires header is used in the configuration of your caching system instead of a static value out of your configuration. +In most cases you don't need to calculate the expiration time manually. +The table above is provided for the orientation, how the Expires header of the HTTP response is calculated by the recommendation engine and already provided to your caching system. +You just need to make sure that the Expires header is used in the configuration of your caching system instead of a static value out of your configuration. ## Integration best Practices @@ -254,7 +253,7 @@ One of the possible technique to work around this limitation is [JSONP](https:// A better solution in comparison with JSONP is to provide the proxy on the server side, which forwards script requests to the Recommender system. It can be implemented as a very simple proxy using the [mod\_proxy module](https://httpd.apache.org/docs/2.2/mod/mod_proxy.html) of Apache Webserver. -It just transfers the data and the JavaScript renders the response into HTML itself. +It transfers the data and the JavaScript renders the response into HTML itself. An alternative approach is creating the HTML code on the server side for every target page in a sense to simplify the script on the client side. @@ -267,7 +266,7 @@ An overview of pros and cons for each of the above techniques: |Problem|Simple Way|Bottom loading|Background loading|JSONP|XMLHttpRequest + Proxy| |---|---|---|---|---|---| |Isn't blocked by ad blockers or no-track plug-ins|Yes|Yes|Yes|-|Yes| -|Works if JavaScript is disabled|Yes|depends|-|-|-| +|Works if JavaScript is disabled|Yes|depends|-|-|-| |Works for server without multithreading functionality|Yes|Yes|-|Yes|Yes| |Compatible with frontend caching on the server|-|-|-|Yes|Yes| |Doesn't delay page rendering|-|depends|depends|Yes|Yes| diff --git a/docs/personalization/personalization.md b/docs/personalization/personalization.md index f5e3be3e88..809d8ca769 100644 --- a/docs/personalization/personalization.md +++ b/docs/personalization/personalization.md @@ -5,10 +5,9 @@ page_type: landing_page # Personalization -Ibexa Personalization is a service that allows you to track the visitors of your website and offers personalized recommendations or serves targeted content, based on their preferences and behavior. +[[= product_name_base =]] Personalization is a service that allows you to track the visitors of your website and offers personalized recommendations or serves targeted content, based on their preferences and behavior. -Personalization can be used both by publishers, for example, to track content consumption -and promote content, and in e-commerce, to drive purchases. +Personalization can be used both by publishers, for example, to track content consumption and promote content, and in e-commerce, to drive purchases. To provide online recommendations, the service must at least: diff --git a/docs/personalization/personalization_guide.md b/docs/personalization/personalization_guide.md index 5ac6746336..44070c6156 100644 --- a/docs/personalization/personalization_guide.md +++ b/docs/personalization/personalization_guide.md @@ -30,7 +30,7 @@ Now, you can start collecting data and boost your business. Personalization with tracking scripts, monitors individual sessions from user’s behavior and interest data through events (clicks, viewed articles, pages, purchases) and demographic data (location, industry, occupation). -Next, collects data and computes models thanks to complex algorithms. +Next, collects data and computes models thanks to complex algorithms. Personalization is SiteAcces-aware, it means it can serve on multiple sites with different customer IDs and deliver recommendations for each site (for example, if you host multi language site). @@ -42,13 +42,13 @@ Use Twig extension to add a tracking script and implement it into your site conf Models are statistics-based and perform calculations based on data from content, users and events. -They work in the background and update on regular time intervals to ensure best and accurate recommendations. Personalization service includes a few predefined models according to your needs and agreements between your organization and Ibexa. +They work in the background and update on regular time intervals to ensure best and accurate recommendations. Personalization service includes a few predefined models according to your needs and agreements between your organization and [[= product_name_base =]]. If you need more customized models, contact customer support. Personalization service includes the following model types: -- popularity models - based on trends, Top clicked, Top purchased, algorithm recommends trending content +- popularity models - based on trends, Top clicked, Top purchased, algorithm recommends trending content - collaborative models - generate predictions by analyzing user behavior and their interactions with target items, compares to other users behavior with similar browsing behavior @@ -61,11 +61,14 @@ Personalization service includes the following model types: ### Scenarios -Scenarios are sequences of events. You can use scenarios to determine how and when render particular content to your customers. Each scenario can include also subscenarios used for granular personalized rendering of content. +Scenarios are sequences of events. +You can use scenarios to determine how and when render particular content to your customers. +Each scenario can include also subscenarios used for granular personalized rendering of content. ### Segments -Use segments to get content targeted at particular user groups. Segments calculate models based on the segment attribute factor. Assign users to different recommendation groups and create advanced logic with operators to get best segmentation for your audience. +Use segments to get content targeted at particular user groups. +Segments calculate models based on the segment attribute factor. Assign users to different recommendation groups and create advanced logic with operators to get best segmentation for your audience. ![Segments](perso_segment_group_or.png) @@ -87,35 +90,43 @@ For more information, see documentation for API operations available for Persona ### Web design and content development -Create websites with content targeted at your customers. Deliver your visitors relevant content and build trust in your brand. +Create websites with content targeted at your customers. +Deliver your visitors relevant content and build trust in your brand. ### Reduce clutter and improve customer retention Help users find content of their interest quicker, use words to appeal to individual customers and segments. Enrich customer data by integrating [[= product_name_base =]] Personalization with other systems such as ERP, CRMs. Track user’s scenarios and develop strategies that match your strategies and improve engagement. + ### Satisfy customer expectations Personalization engine shows customers products relevant to their interests, builds a feeling of connection and understanding. ### Increase customer engagement -Targeted and customized content considerably improves engagement by delivering content that fits your visitors interests and anticipates their needs. This creates a bound between your brand and users who spend more time on your website, and are more likely to come back to your services. A kind of loyalty is created. +Targeted and customized content considerably improves engagement by delivering content that fits your visitors interests and anticipates their needs. +This creates a bound between your brand and users who spend more time on your website, and are more likely to come back to your services. +A kind of loyalty is created. ### Improve customer experience -Stand out from other companies by provided well-suited content and make a space for your customers where they feel known and valued and treated exceptional. Build trust and a bond with visitors, who are more likely to come back. +Stand out from other companies by provided well-suited content and make a space for your customers where they feel known and valued and treated exceptional. +Build trust and a bond with visitors, who are more likely to come back. -### Increase average order value +### Increase average order value -Apply collaborative models with predictive analysis and find out what motivates users to put extra items into their carts. Start building predictions of their behaviors and suggest items, products your visitors are willing to buy. +Apply collaborative models with predictive analysis and find out what motivates users to put extra items into their carts. +Start building predictions of their behaviors and suggest items, products your visitors are willing to buy. ![Dashboard](perso_dashboard_revenue.png) -### Measure your return and boost conversion rates +### Measure your return and boost conversion rates -Connect Personalization engine with your eCommerce shop, focus on the revenue generated by recommendations. Track what recommendations are shown to your visitors and analyze conversion rates. Effectively evaluate quality of recommendations and compare with your KPIs. +Connect Personalization engine with your eCommerce shop, focus on the revenue generated by recommendations. +Track what recommendations are shown to your visitors and analyze conversion rates. +Effectively evaluate quality of recommendations and compare with your KPIs. ## Use cases diff --git a/docs/personalization/recommendation_integration.md b/docs/personalization/recommendation_integration.md index 16b1e861e4..e2d0265b1e 100644 --- a/docs/personalization/recommendation_integration.md +++ b/docs/personalization/recommendation_integration.md @@ -4,68 +4,46 @@ description: Methods for REST call with Personalization server. # Recommendation integration -There are several ways to integrate the REST calls with the Personalization server -and to avoid blocking webpage rendering, if the communication with the Recommender -is distrusted or interrupted. +There are several ways to integrate the REST calls with the Personalization server and to avoid blocking webpage rendering, if the communication with the Recommender is distrusted or interrupted. ## Use page blocks -[[= product_name =]] ships with a number of page blocks that editors can place on -landing pages and configure to present scenario results. -To work, these blocks require that Personalization and scenarios are properly -configured. -For a list of all page blocks that are available out-of-the-box, -see [Page block reference]([[= user_doc =]]/content_management/block_reference/). +[[= product_name =]] ships with a number of page blocks that editors can place on landing pages and configure to present scenario results. +To work, these blocks require that Personalization and scenarios are properly configured. +For a list of all page blocks that are available out-of-the-box, see [Page block reference]([[= user_doc =]]/content_management/block_reference/). ## Request recommendations synchronously -The simplest way to load recommendations is to synchronously request the Personalization -server for recommendations as they're needed. This way is sufficient in most cases. -The most important drawback is that the request time increases by the time -of the recommendation request. -If the network is overloaded or the Personalization server isn't available, -it can lock the request. +The simplest way to load recommendations is to synchronously request the Personalization server for recommendations as they're needed. This way is sufficient in most cases. +The most important drawback is that the request time increases by the time of the recommendation request. +If the network is overloaded or the Personalization server isn't available, it can lock the request. ## Load in the bottom -You can place the code that loads the data from the eZ Recommender at the bottom -of the generated document and flush the output buffer to the client -before requesting recommendations. -The browser gets a whole page to render and can display it even if the very end -of the page is still loading. -Then the JavaScript code with the recommendation information loaded at the bottom -of the page must fill the gaps on the page with recommendations as soon as -it's completely loaded. +You can place the code that loads the data from the eZ Recommender at the bottom of the generated document and flush the output buffer to the client before requesting recommendations. +The browser gets a whole page to render and can display it even if the very end of the page is still loading. +Then the JavaScript code with the recommendation information loaded at the bottom of the page must fill the gaps on the page with recommendations as soon as it's completely loaded. ## Non-blocking load in the background -If the website is implemented in a language that supports multithreading or -non-blocking I/O, the recommendation request can start right after the browser -request is received. -The page generation and the recommendation requests are accomplished in parallel. -By combining this idea with the previous solution and placing the recommendation -results at the bottom of the page you can avoid any interruption in the processing. +If the website is implemented in a language that supports multithreading or non-blocking I/O, the recommendation request can start right after the browser request is received. +The page generation and the recommendation requests are accomplished in parallel. +By combining this idea with the previous solution and placing the recommendation results at the bottom of the page you can avoid any interruption in the processing. ## Load from JavaScript using JSONP -You cannot request the recommendation controller server directly from the JavaScript -(over AJAX library or directly over XMLHttpRequest) because of the cross-domain -restriction in most browsers. +You cannot request the recommendation controller server directly from the JavaScript (over AJAX library or directly over XMLHttpRequest) because of the cross-domain restriction in most browsers. One of the possible ways to work around this limitation is JSONP. ## Load over proxy -A better solution than JSONP is to provide the proxy on the server side, which -forwards script requests to the Personalization service. -It can be implemented as a basic proxy using the `mod_proxy` module of -the Apache Webserver. +A better solution than JSONP is to provide the proxy on the server side, which forwards script requests to the Personalization service. +It can be implemented as a basic proxy using the `mod_proxy` module of the Apache Webserver. It transfers the data and the JavaScript renders the response into HTML itself. -An alternative approach is to create the HTML code on the server side for every -target page, to simplify the script on the client side. +An alternative approach is to create the HTML code on the server side for every target page, to simplify the script on the client side. -You can use the following tools as an implementation of such a proxy: -the Apache proxy module, an independent daemon like “netcat” or a PHP script. +You can use the following tools as an implementation of such a proxy: the Apache proxy module, an independent daemon like “netcat” or a PHP script. ## Comparison @@ -74,7 +52,7 @@ An overview of pros and cons for each of the presented techniques: |Feature|Synchronous loading|Bottom loading|Background loading|JSONP|XMLHttpRequest + Proxy| |---|---|---|---|---|---| |Isn't blocked by ad blockers or no-track plug-ins|✔|✔|✔|-|✔| -|Works if JavaScript is disabled|Yes|depends|-|-|-| +|Works if JavaScript is disabled|Yes|depends|-|-|-| |Works for server without multithreading functionality|✔|✔|-|✔|✔| |Compatible with frontend caching on the server|-|-|-|✔|✔| |Doesn't delay page rendering|-|depends|depends|✔|✔| diff --git a/docs/personalization/tracking_integration.md b/docs/personalization/tracking_integration.md index 89dfb423f1..f526e90639 100644 --- a/docs/personalization/tracking_integration.md +++ b/docs/personalization/tracking_integration.md @@ -4,9 +4,8 @@ description: See the methods of event tracking integration using tracking from s # Tracking integration -There are several ways to integrate event reporting into the webpage. -The simplest way is to generate code of a tiny image and put it on the webpage -where the event must be sent [pixel tracking](integrate_recommendation_service.md#track-events). +There are several ways to integrate event reporting into the webpage. +The simplest way is to generate code of a tiny image and put it on the webpage where the event must be sent [pixel tracking](integrate_recommendation_service.md#track-events). For example, with HTML:  @@ -25,49 +24,38 @@ img.src = "https://event.perso.ibexa.co/ebl/00000/click/johndoe/1/100?categorypa -The drawback of this option is that such calls can be blocked by ad blockers -or do-not-track plugins on the client side. +The drawback of this option is that such calls can be blocked by ad blockers or do-not-track plugins on the client side. ## Server-side tracking -Another option is to call the tracker from the server. -The most important drawback is that the event request increases the general request time. -If the network is overloaded or the Personalization server isn't available, -the number of requests can grow and lead to a stalled and finally crashing HTTP service. +Another option is to call the tracker from the server. +The most important drawback is that the event request increases the general request time. +If the network is overloaded or the Personalization server isn't available, the number of requests can grow and lead to a stalled and finally crashing HTTP service. See below the techniques that help avoid these problems. ### Tracking at the bottom -You can place the code at the very end of the generating script -and flush the output buffer to the client before sending the events. -The connection to the browser can remain open for the time of processing, -but it's transparent for the end user. +You can place the code at the very end of the generating script and flush the output buffer to the client before sending the events. +The connection to the browser can remain open for the time of processing, but it's transparent for the end user. ### Tracking asynchronously -If the website is implemented in a language that supports multithreading, non-blocking -I/O or messaging infrastructure, you can start the event request right after -the browser request is received instead of waiting for this process to finish. +If the website is implemented in a language that supports multithreading, non-blocking I/O or messaging infrastructure, you can start the event request right after the browser request is received instead of waiting for this process to finish. ## Client-side tracking ### Using JSONP -Another solution is to provide a proxy on the server side, which forwards -script requests to the Personalization server. -In this model, the requests are triggered from the client, when the page is already -loaded and rendered. -It's impossible to request the recommendation controller server directly from JavaScript -(either through the AJAX library or directly over XMLHttpRequest) because of the -cross-domain restriction in most browsers. +Another solution is to provide a proxy on the server side, which forwards script requests to the Personalization server. +In this model, the requests are triggered from the client, when the page is already loaded and rendered. +It's impossible to request the recommendation controller server directly from JavaScript (either through the AJAX library or directly over XMLHttpRequest) because of the cross-domain restriction in most browsers. One possible work around this limitation is [JSONP](https://www.w3schools.com/js/js_json_jsonp.asp). ### Using server proxy -Another option is to tunnel the JavaScript request through the proxy on the same server. -The server only forwards requests to the Personalization server. -It can be an implemented Apache proxy module, an independent daemon -(for example, "netcat"), or a PHP script. +Another option is to tunnel the JavaScript request through the proxy on the same server. +The server only forwards requests to the Personalization server. +It can be an implemented Apache proxy module, an independent daemon (for example, "netcat"), or a PHP script. ## Comparison @@ -83,14 +71,8 @@ An overview of pros and cons for every technique: !!! tip "The recommended approach" - An Ibexa-recommended solution is to use pixel tracking for non-complex events, - or where every page is generated on the server side without any caching logic. - For hints about preloading image URLs with JavaScript elements - (`var img = new Image(); img.src="uri"`) - or without them (`<img src="uri"... />`), see [How to Preload Images](https://www.mediacollege.com/internet/javascript/image/preload.html). + An Ibexa-recommended solution is to use pixel tracking for non-complex events, or where every page is generated on the server side without any caching logic. + For hints about preloading image URLs with JavaScript elements (`var img = new Image(); img.src="uri"`) or without them (`<img src="uri"... />`), see [How to Preload Images](https://www.mediacollege.com/internet/javascript/image/preload.html). - If you plan to implement caching mechanisms and more complex events like - Consume (depending on the viewing time of the page), Basket (which is usually - an in-page event) or custom in-page events that take place on the client side, - a JavaScript implementation is strongly encouraged. + If you plan to implement caching mechanisms and more complex events like Consume (depending on the viewing time of the page), Basket (which is usually an in-page event) or custom in-page events that take place on the client side, a JavaScript implementation is strongly encouraged. For a sample script and instructions, see [Track with ibexa-tracker.js](tracking_with_ibexa-tracker.md). diff --git a/docs/personalization/tracking_with_ibexa-tracker.md b/docs/personalization/tracking_with_ibexa-tracker.md index 33807e9df9..a213ce8d85 100644 --- a/docs/personalization/tracking_with_ibexa-tracker.md +++ b/docs/personalization/tracking_with_ibexa-tracker.md @@ -4,29 +4,21 @@ description: Integrate tracking with a Google-style JavaScript. # Track events with ibexa-tracker.js -This is another example of how you can integrate the tracking with a Google-style -JavaScript in your site. -The approach is very generic and evaluate it if it meets your -**requirements and security policy**. - -If you want the `userid` to be generated automatically, leave out the user -params in the `_ycq.push` calls. -If a predefined cookie already exists, it's used. +This is another example of how you can integrate the tracking with a Google-style JavaScript in your site. +The approach is very generic and evaluate it if it meets your **requirements and security policy**. + +If you want the `userid` to be generated automatically, leave out the user params in the `_ycq.push` calls. +If a predefined cookie already exists, it's used. Otherwise a new one is created. ## Tracking code quickstart -The Personalization JavaScript is a Google-like tracking API (ga.js) that you can paste -into your pages. -It activates the tracking by inserting  -into the page. +The Personalization JavaScript is a Google-like tracking API (ga.js) that you can paste into your pages. +It activates the tracking by inserting  into the page. -To use this mechanism on your pages, copy the code snippet below, and replace -`` with the customer ID, `` with the page/item identifier  -and `` with the one generated by your user identifier. -All identifiers can be any form of string. -Paste this snippet into your website template page so that it appears before -the closing `` tag. +To use this mechanism on your pages, copy the code snippet below, and replace `` with the customer ID, `` with the page/item identifier and `` with the one generated by your user identifier. +All identifiers can be any form of string. +Paste this snippet into your website template page so that it appears before the closing `` tag. ``` js
`. An align attribute may only have the following values: `left`, `right`, `center`, `justify`. -In order to fix the problem, open the .xml file in a text editor and correct the errors: +To fix the problem, open the .xml file in a text editor and correct the errors: ```xml @@ -388,7 +388,7 @@ Now, you may test if the modified `ezxmltext` may be converted using the `--dry- `php -d memory_limit=1536M bin/console ezxmltext:import-xml --dry-run --export-dir=ezxmltext-export --content-object=56554 -v` -If the tool reports no errors, then the `ezxmltext` is fixed. You may rerun the command without the `--dry-run` option in order to actually update the database with the correct XmlText. +If the tool reports no errors, then the `ezxmltext` is fixed. You may rerun the command without the `--dry-run` option to actually update the database with the correct XmlText. Once you have fixed all the dump files in `ezxmltext-export/`, you may skip the `--content-object` option and the script imports all the dump files located in the `export-dir`: @@ -438,7 +438,7 @@ eZ Platform now supports custom tags, including inline custom tags, and limited After migrating to RichText, you need to adapt your custom tag config for eZ Platform and rewrite the custom tags in Twig. See [Custom tag documentation](https://doc.ibexa.co/en/2.5/guide/extending/extending_online_editor/#custom-tags) for more info. -If you configured custom attributes in legacy in OE using [ezoe_attributes.ini](https://github.com/ezsystems/ezpublish-legacy/blob/master/extension/ezoe/settings/ezoe_attributes.ini#L33-L48), note that not all types are supported. +If you configured custom attributes in legacy in OE using [ezoe_attributes.ini](https://github.com/ezsystems/ezpublish-legacy/blob/master/extension/ezoe/settings/ezoe_attributes.ini#L33-L48), not all types are supported. Below is a table of the tags that are currently supported, and their corresponding names in eZ Platform. diff --git a/docs/users/customer_groups.md b/docs/users/customer_groups.md index c5ece13415..105e0f65f1 100644 --- a/docs/users/customer_groups.md +++ b/docs/users/customer_groups.md @@ -11,13 +11,13 @@ For example, you can offer a 10% discount for all products in the catalog to use !!! tip - Note that customer groups aren't the same as [user groups](user_registration.md#user-groups). + Customer groups aren't the same as [user groups](user_registration.md#user-groups). User groups concern all users in the system and can be used, for example, to handle permissions. Customer groups refer specifically to the commerce functionalities and enable handling prices. ## Enabling customer groups To enable using customer groups, you need to modify the User content type's definition -by adding a [Customer Group Field](customergroupfield.md). +by adding a [customer group field](customergroupfield.md). With this field you can add a user to any of the predefined customer groups. From fa50644a349b5aad99fc43db2e4d3e4eca7c0d73 Mon Sep 17 00:00:00 2001 From: julitafalcondusza Date: Mon, 14 Oct 2024 15:07:16 +0200 Subject: [PATCH 12/77] Fixes --- .../admin_panel/segments_admin_panel.md | 10 +-- .../rest_api/rest_api_usage/rest_requests.md | 4 +- docs/commerce/checkout/checkout.md | 8 +- docs/commerce/checkout/checkout_api.md | 12 +-- docs/commerce/checkout/configure_checkout.md | 13 ++- docs/commerce/checkout/customize_checkout.md | 47 +++++----- docs/commerce/commerce.md | 2 +- .../order_management/order_management.md | 7 +- docs/commerce/payment/configure_payment.md | 14 +-- docs/commerce/payment/extend_payment.md | 9 +- docs/commerce/payment/payment_api.md | 14 +-- docs/commerce/payment/payment_method_api.md | 22 +++-- .../payment/payment_method_filtering.md | 4 +- docs/commerce/payment/payum_integration.md | 2 + .../shipping_management/configure_shipment.md | 11 ++- .../shipping_management/extend_shipping.md | 19 +++-- .../shipping_management/shipment_api.md | 11 ++- .../shipping_method_api.md | 4 +- .../storefront/configure_storefront.md | 7 +- docs/commerce/storefront/extend_storefront.md | 10 +-- docs/commerce/storefront/storefront.md | 7 +- .../extend_transactional_emails.md | 8 +- .../content_api/browsing_content.md | 85 +++++++------------ .../content_api/creating_content.md | 10 +-- .../content_api/managing_content.md | 8 +- docs/content_management/content_management.md | 2 +- .../content_management_api/bookmark_api.md | 6 +- .../object_state_api.md | 17 ++-- .../content_management_api/section_api.md | 9 +- .../content_management_guide.md | 16 ++-- docs/content_management/content_relations.md | 18 ++-- .../create_custom_field_type_comparison.md | 8 +- .../create_custom_generic_field_type.md | 2 +- .../customize_field_type_metadata.md | 16 ++-- .../field_type_reference/addressfield.md | 6 +- .../field_type_reference/binaryfilefield.md | 4 +- .../field_type_reference/contentqueryfield.md | 2 +- .../field_type_reference/countryfield.md | 8 +- .../customergroupfield.md | 2 +- .../field_type_reference/dateandtimefield.md | 8 +- .../field_type_reference/datefield.md | 8 +- .../field_type_reference.md | 7 +- .../field_type_reference/imagefield.md | 30 +++---- .../field_type_reference/isbnfield.md | 2 +- .../field_type_reference/maplocationfield.md | 2 +- .../field_type_reference/matrixfield.md | 26 +++--- .../field_type_reference/relationfield.md | 2 +- .../field_type_reference/relationlistfield.md | 6 +- .../field_type_reference/selectionfield.md | 4 +- .../field_type_reference/sesexternaldata.md | 2 +- .../field_type_reference/sesprofiledata.md | 2 +- .../field_type_reference/sesselection.md | 2 +- .../specificationstype.md | 2 +- .../taxonomyentryassignmentfield.md | 10 +-- .../taxonomyentryfield.md | 4 +- .../field_type_reference/timefield.md | 4 +- .../field_types/field_type_search.md | 22 ++--- .../field_types/field_type_storage.md | 28 +++--- .../field_types/field_type_validation.md | 2 +- .../field_types/field_types.md | 6 +- .../field_types/form_and_template.md | 18 ++-- .../field_types/type_and_value.md | 2 +- .../forms/create_form_attribute.md | 6 +- docs/content_management/forms/form_api.md | 2 +- .../forms/form_builder_guide.md | 2 +- .../images/add_image_asset_from_dam.md | 2 +- .../images/configure_image_editor.md | 2 +- .../pages/page_builder_guide.md | 12 +-- .../rich_text/extend_online_editor.md | 2 +- .../rich_text/online_editor_guide.md | 14 +-- .../url_management/url_api.md | 4 +- docs/permissions/limitation_reference.md | 8 +- docs/permissions/policies.md | 18 ++-- .../authorterm_aggregation.md | 2 +- .../checkboxterm_aggregation.md | 2 +- .../countryterm_aggregation.md | 2 +- .../daterange_aggregation.md | 2 +- .../datetimerange_aggregation.md | 2 +- .../floatrange_aggregation.md | 2 +- .../floatstats_aggregation.md | 2 +- .../integerrange_aggregation.md | 2 +- .../integerstats_aggregation.md | 2 +- .../keywordterm_aggregation.md | 2 +- .../selectionterm_aggregation.md | 2 +- .../timerange_aggregation.md | 2 +- .../criteria_reference/field_criterion.md | 6 +- .../criteria_reference/fulltext_criterion.md | 2 +- .../criteria_reference/image_criterion.md | 2 +- .../imagedimensions_criterion.md | 2 +- .../imagefilesize_criterion.md | 2 +- .../imageheight_criterion.md | 2 +- .../imagemimetype_criterion.md | 2 +- .../imageorientation_criterion.md | 2 +- .../imagewidth_criterion.md | 2 +- .../isfieldempty_criterion.md | 4 +- .../maplocationdistance_criterion.md | 6 +- .../search_criteria_reference.md | 10 +-- .../create_custom_aggregation.md | 4 +- docs/search/search_api.md | 8 +- .../search_criteria_and_sort_clauses.md | 2 +- docs/search/search_engines/search_engines.md | 2 +- .../solr_search_engine/configure_solr.md | 2 +- .../field_sort_clause.md | 8 +- .../maplocationdistance_sort_clause.md | 6 +- .../sort_clause_reference.md | 4 +- .../2_create_the_content_model.md | 4 +- .../5_display_a_list_of_content_items.md | 2 +- .../beginner_tutorial/7_embed_content.md | 6 +- .../1_implement_the_point2d_value_class.md | 4 +- .../2_define_point2d_field_type.md | 2 +- .../3_create_form_for_point2d.md | 8 +- .../4_introduce_a_template.md | 4 +- .../generic_field_type/5_add_a_field.md | 6 +- .../generic_field_type/7_add_a_validation.md | 2 +- .../generic_field_type/8_data_migration.md | 2 +- .../1_get_a_starter_website.md | 4 +- .../2_prepare_the_landing_page.md | 2 +- .../5_create_newsletter_form.md | 2 +- docs/users/customer_groups.md | 2 +- docs/users/invitations.md | 18 ++-- docs/users/login_methods.md | 32 +++---- docs/users/oauth_client.md | 32 +++---- docs/users/oauth_server.md | 2 +- docs/users/passwords.md | 14 ++- docs/users/segment_api.md | 37 ++++---- 125 files changed, 486 insertions(+), 536 deletions(-) diff --git a/docs/administration/admin_panel/segments_admin_panel.md b/docs/administration/admin_panel/segments_admin_panel.md index a0f7db0b3f..0abc63e172 100644 --- a/docs/administration/admin_panel/segments_admin_panel.md +++ b/docs/administration/admin_panel/segments_admin_panel.md @@ -1,19 +1,19 @@ --- -description: You can use Segments to display specific content to specific users. +description: You can use segments to display specific content to specific users. edition: experience --- # Segments -You can use Segments to display specific content to specific [ussers](users.md). +You can use segments to display specific content to specific [ussers](users.md). they're used out of the box in the Targeting and Dynamic targeting blocks in the page. -Segments are collected in Segment Groups: +Segments are collected in segment groups: ![Segment Groups](admin_panel_segment_groups.png) -Each Segment Group can contain Segments that you can target content for. +Each segment group can contain segments that you can target content for. ![Segment](admin_panel_segment.png) -You can assign users to Segments [through the API](segment_api.md#assigning-users). \ No newline at end of file +You can assign users to segments [through the API](segment_api.md#assigning-users). \ No newline at end of file diff --git a/docs/api/rest_api/rest_api_usage/rest_requests.md b/docs/api/rest_api/rest_api_usage/rest_requests.md index cf59e50988..975668d4c2 100644 --- a/docs/api/rest_api/rest_api_usage/rest_requests.md +++ b/docs/api/rest_api/rest_api_usage/rest_requests.md @@ -114,7 +114,7 @@ On top of methods, HTTP request headers allow you to personalize the request's b On every resource, you can use the `Accept` header to indicate which format you want to communicate in, JSON or XML. This header is also used to specify the response type you want the server to send when multiple types are available. -- `Accept: application/vnd.ibexa.api.Content+xml` to get `Content` (full data, Fields included) as **[XML](https://www.w3.org/XML/)** +- `Accept: application/vnd.ibexa.api.Content+xml` to get `Content` (full data, fields included) as **[XML](https://www.w3.org/XML/)** - `Accept: application/vnd.ibexa.api.ContentInfo+json` to get `ContentInfo` (metadata only) as **[JSON](https://www.json.org/)** Media types are also used with the [`Content-Type` header](rest_responses.md#content-type-header) to characterize a [request body](#request-body) or a [response body](rest_responses.md#response-body). @@ -151,7 +151,7 @@ In the [REST API reference](../rest_api_reference/rest_api_reference.html), requ One example is the [creation of an authentication session](rest_api_authentication.md#establishing-session). -When creating a content item, a special payload is needed if the content type has some [Image](imagefield.md) or [BinaryFile](binaryfilefield.md) Fields as files need to be attached. See the example of a [script uploading images](#creating-content-with-binary-attachments) below. +When creating a content item, a special payload is needed if the content type has some [Image](imagefield.md) or [BinaryFile](binaryfilefield.md) fields as files need to be attached. See the example of a [script uploading images](#creating-content-with-binary-attachments) below. When searching for content items (or Locations), the query grammar is also particular. See the [Search section](#search-views) below. diff --git a/docs/commerce/checkout/checkout.md b/docs/commerce/checkout/checkout.md index 9b51c09105..802925107a 100644 --- a/docs/commerce/checkout/checkout.md +++ b/docs/commerce/checkout/checkout.md @@ -6,21 +6,21 @@ edition: commerce # Checkout Checkout is a crucial component of the Commerce offering delivered as part of [[= product_name_com =]]. -In a course of a multi-step process, it collects necessary transaction data, such as billing and shipping addresses, and payment and shipping information. +In a course of a multi-step process, it collects necessary transaction data, such as billing and shipping addresses, payment and shipping information. From the front-end perspective, it's a reusable component that provides access to the workflow and allows buyers to place an order for cart items. ![Address selection stage](checkout.png "Checkout stages") -Depending on the model of shopping process that you need to use, the checkout process can range between a straightforward and extremely complicated one. +Depending on the model of shopping process that you need to use, the checkout process can range between a straightforward and extremely complicated one. To allow for this variation, the component is highly configurable and extensible: -- Like the editorial workflow, it relies on [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html) +- Like the editorial workflow, it relies on [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html) - It exposes [PHP API](checkout_api.md) that allows for workflow manipulation - It exposes Twig functions used for checkout rendering In a default implementation, users go through a series of steps. -They first select a billing and shipping address, then select shipping and payment methods, later they review summary and confirm their choices, to finally receive a simulated order confirmation. +They first select a billing and shipping address, then select shipping and payment methods, later they review summary, and confirm their choices, to finally receive a simulated order confirmation. Until the checkout process is complete, at any point of the process, users can go back to the cart and modify cart information, for example, cart item quantities. They can also navigate back and forth between checkout steps, with an exception of the "Checkout complete" step, which always ends the process. diff --git a/docs/commerce/checkout/checkout_api.md b/docs/commerce/checkout/checkout_api.md index 3393fd2c82..2a66e649f2 100644 --- a/docs/commerce/checkout/checkout_api.md +++ b/docs/commerce/checkout/checkout_api.md @@ -7,15 +7,15 @@ edition: commerce To get checkouts and manage them, use the `Ibexa\Contracts\Checkout\CheckoutServiceInterface` interface. -With `CheckoutServiceInterface`, you manipulate checkouts that are stored in sessions. -Checkouts are containers for the `Ibexa\Contracts\Cart\Value\CartInterface` object and all the data provided at each step of the [configurable checkout process](configure_checkout.md). +With `CheckoutServiceInterface`, you manipulate checkouts that are stored in sessions. +Checkouts are containers for the `Ibexa\Contracts\Cart\Value\CartInterface` object and all the data provided at each step of the [configurable checkout process](configure_checkout.md). -The checkout process relies on Symfony Workflow, and you can customize each of its steps. +The checkout process relies on Symfony Workflow, and you can customize each of its steps. Each checkout step has its own controller that allows adding forms and external API calls that process data and pass them to `CheckoutService`. -Completing a step results in submitting a form and updating the current checkout object. +Completing a step results in submitting a form and updating the current checkout object. At this point Symfony Workflow advances, the next controller takes over, and the whole process continues. -From the developer's perspective, checkouts are referenced with an UUID identifier. +From the developer's perspective, checkouts are referenced with an UUID identifier. ## Get single checkout by identifier @@ -27,7 +27,7 @@ To access a single checkout, use the `CheckoutServiceInterface::getCheckout` met ## Get single checkout for specific cart -To fetch checkout for a cart that already exists, use the `CheckoutServiceInterface::getCheckoutForCart` method. +To fetch checkout for a cart that already exists, use the `CheckoutServiceInterface::getCheckoutForCart` method. You can use it when you want to initiate the checkout process right after products are successfully added to a cart. ``` php diff --git a/docs/commerce/checkout/configure_checkout.md b/docs/commerce/checkout/configure_checkout.md index fb60c3c309..4079c6da97 100644 --- a/docs/commerce/checkout/configure_checkout.md +++ b/docs/commerce/checkout/configure_checkout.md @@ -7,27 +7,26 @@ edition: commerce When you work with your Commerce implementation, you can review and modify the checkout configuration. -!!! note "Permissions" +!!! note "Permissions" When you modify the workflow configuration, make sure you properly set user [permissions](permission_use_cases.md#commerce) to the checkout component. ## Configure checkout workflow Checkout workflow relies on [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html). -Each transition represents a separate checkout step. +Each transition represents a separate checkout step. By default, the checkout process is configured to render each step based on a separate set of libraries and templates. Each checkout step is handled by a controller that you configure in workflow metadata. -Custom workflow implementations are defined under the `framework.workflows` key, -and they must support the `Ibexa\Contracts\Checkout\Value\CheckoutInterface`. +Custom workflow implementations are defined under the `framework.workflows` key, and they must support the `Ibexa\Contracts\Checkout\Value\CheckoutInterface`. The default fallback workflow is `ibexa_checkout`, which is prepended at bundle level. The `checkout.workflow` parameter is repository-aware. -To customize your configuration, place it in a YAML file, under the `framework.workflows.` key, and reference it with `ibexa.repositories..checkout.workflow: your_workflow_name`. +To customize your configuration, place it in a YAML file, under the `framework.workflows.` key, and reference it with `ibexa.repositories..checkout.workflow: your_workflow_name`. The system can then identify which of your configured workflows handles the checkout process. -!!! note +!!! note When you modify or create a controller, to ensure that no user data is lost, extend the `Ibexa\Bundle\Checkout\Controller\AbstractStep` controller and call the `advance()` method. @@ -53,7 +52,7 @@ For more information, see [Work with shipping methods]([[= user_doc =]]/commerce In your implementation, you may need to create custom format configurations for the shipping or billing address fields, for example, to use different address formats based on the buyer's geographical location. -Field formats for the billing and shipping addresses comply with the [FieldType Address](addressfield.md#formats) specification and can be controlled with the `billing_address_format` and `shipping_address_format` flags, respectively. +Field formats for the billing and shipping addresses comply with the [FieldType Address](addressfield.md#formats) specification and can be controlled with the `billing_address_format` and `shipping_address_format` flags. They fall back to `billing` and `shipping` predefined formats by default: - `billing` is part of the `ibexa/corporate-accounts` repository diff --git a/docs/commerce/checkout/customize_checkout.md b/docs/commerce/checkout/customize_checkout.md index bab5967f5d..6ca8db41fc 100644 --- a/docs/commerce/checkout/customize_checkout.md +++ b/docs/commerce/checkout/customize_checkout.md @@ -16,19 +16,19 @@ It collects data that is necessary to create an order, including: It could also collect any other information that you find necessary. -Depending on your needs, the checkout process can be either complicated or simple. +Depending on your needs, the checkout process can be either complex or straightforward. For example, if the website is selling airline tickets, you may need several [additional steps](#add-checkout-step) with passengers defining their special needs. On the other side of the spectrum would be a store that sells books with personal pickup, where [one page checkout](#create-a-one-page-checkout) would be enough. -There are several factors that make checkout particularly flexible and customizable: +Several factors can make checkout particularly flexible and customizable: - it's based on Symfony workflow - it exposes a variety of APIs - it exposes Twig functions that help you render the steps -The most important contract exposed by the package is the `CheckoutServiceInterface` interface. -It exposes a number of methods that you can call, for example, to load checkouts based on checkout identifier or for a specific cart. -Other methods help you create, update, or delete checkouts. +The most important contract exposed by the package is the `CheckoutServiceInterface` interface. +It exposes a number of methods that you can call, for example, to load checkouts based on checkout identifier or for a specific cart. +Other methods help you create, update, or delete checkouts. For more information, see [Checkout API](checkout_api.md). @@ -39,11 +39,10 @@ For example, if you were creating a project for selling theater tickets, you cou ### Define workflow -You can create workflow definitions under the `framework.workflows` [configuration key](configuration.md#configuration-files). -Each workflow definition consists of a series of steps and a series of transitions between the steps. +You can create workflow definitions under the `framework.workflows` [configuration key](configuration.md#configuration-files). +Each workflow definition consists of a series of steps and a series of transitions between the steps. -To create a new workflow, for example, `seat_selection_checkout`, use the default workflow that comes with the storefront module as a basis, -and add a `seat_selected` step. +To create a new workflow, for example, `seat_selection_checkout`, use the default workflow that comes with the storefront module as a basis, and add a `seat_selected` step. ``` yaml hl_lines="3 15" [[= include_file('code_samples/front/shop/checkout/config/packages/checkout.yaml', 17, 19) =]] [[= include_file('code_samples/front/shop/checkout/config/packages/checkout.yaml', 38, 54) =]] @@ -63,7 +62,7 @@ In this case, you want users to select seats in the audience. In the `src/Controller/Checkout/Step` folder, create a file that resembles the following example. -The controller contains a Symfony form that collects user selections. +The controller contains a Symfony form that collects user selections. It can reuse fields and functions that come from the checkout component, for example, after you check whether the form is valid, use the `AbstractStepController::advance` method to go to the next step of the process. ``` php hl_lines="23 24" @@ -97,7 +96,7 @@ In `assets/styles/checkout.css`, add styles required to properly display your te Remember to [add the new asset file to your Webpack configuration](assets.md#configure-assets). -### Select supported workflow +### Select supported workflow Next, you must inform the application that the configured workflow is used in your repository. @@ -106,7 +105,7 @@ You do it in repository configuration, under the `ibexa.repositories.: + : checkout: workflow: new_workflow ``` @@ -268,12 +265,12 @@ When you have multiple checkout workflows, you can specify which one to use by p ``` -With this setup, you can specify which workflow to use by clicking the button or link that starts the checkout. +With this setup, you can specify which workflow to use by clicking the button or link that starts the checkout. The argument passed determines which workflow is used, providing flexibility in workflow selection. -## Define custom Address field type formats +## Define custom Address field type formats -To create custom Address field type formats to be used in checkout, make the following changes in the project configuration files. +To create custom Address field type formats to be used in checkout, make the following changes in the project configuration files. First, define custom format configuration keys for `billing_address_format` and `shipping_address_format`: diff --git a/docs/commerce/commerce.md b/docs/commerce/commerce.md index abd000ed13..1a15fc642a 100644 --- a/docs/commerce/commerce.md +++ b/docs/commerce/commerce.md @@ -6,7 +6,7 @@ page_type: landing_page # Commerce -The commerce component of [[= product_name =]] covers various areas of managing an e-commerce presence: from configuring payment and shipping methods, through processing a transaction (listing available products, adding products to a cart, processing checkout and sending confirmation), all the way to order management. +The commerce component of [[= product_name =]] covers various areas of managing an e-commerce presence: from configuring payment and shipping methods, through processing a transaction (listing available products, adding products to a cart, processing checkout, and sending confirmation), all the way to order management. [[= cards([ "commerce/cart/cart", diff --git a/docs/commerce/order_management/order_management.md b/docs/commerce/order_management/order_management.md index b49dc30fbd..b43dc13654 100644 --- a/docs/commerce/order_management/order_management.md +++ b/docs/commerce/order_management/order_management.md @@ -5,7 +5,7 @@ edition: commerce # Order management -The order management component enables users to search for orders and filter search results. +The order management component enables users to search for orders and filter search results. Depending on their role, users can also track the status of their orders, review order details, and cancel orders. From the development perspective, the component enables customization of the order management workflow and integration with external systems to exchange order information. @@ -15,7 +15,6 @@ The component exposes the following: - [PHP API](order_management_api.md) that allows for managing orders - [REST API](../../api/rest_api/rest_api_reference/rest_api_reference.html#orders) that helps get order information over HTTP -### Order management service +### Order management service -The Order Management package provides the `Ibexa\Contracts\OrderManagement\OrderServiceInterface` service, -which is the entrypoint for calling the [backend API](order_management_api.md). +The Order Management package provides the `Ibexa\Contracts\OrderManagement\OrderServiceInterface` service, which is the entrypoint for calling the [backend API](order_management_api.md). diff --git a/docs/commerce/payment/configure_payment.md b/docs/commerce/payment/configure_payment.md index df0b3b6f61..8cdca2e74f 100644 --- a/docs/commerce/payment/configure_payment.md +++ b/docs/commerce/payment/configure_payment.md @@ -7,14 +7,14 @@ edition: commerce When you work with your Commerce implementation, you can review and modify the payment configuration. -!!! note "Permissions" +!!! note "Permissions" When you modify the workflow configuration, make sure you properly set user [permissions](permission_use_cases.md#commerce) for the Payment component. ## Configure payment workflow Payment workflow relies on a [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html). -Each transition represents a separate payment step. +Each transition represents a separate payment step. ### Default payment workflow configuration @@ -25,16 +25,16 @@ You can replace the default workflow configuration with a custom one if needed. ### Custom payment workflows -You define custom workflow implementations under the `framework.workflows` key. +You define custom workflow implementations under the `framework.workflows` key. They must support the `Ibexa\Contracts\Checkout\Value\CheckoutInterface`. -If your installation supports multiple languages, for each place in the workflow, you can define a label that is pulled from an XLIFF file based on the translation domain setting. +If your installation supports multiple languages, for each place in the workflow, you can define a label that is pulled from an XLIFF file based on the translation domain setting. You can also define colors that are used for status labels. The `primary_color` key defines a color of the font used for the label, while the `secondary_color` key defines a color of its background. -Additionally, you can decide whether users can manually transition between places. -You do this by setting a value for the `exposed` key. -If you set it to `true`, a button is displayed in the UI that triggers the transition. +Additionally, you can decide whether users can manually transition between places. +You do this by setting a value for the `exposed` key. +If you set it to `true`, a button is displayed in the UI that triggers the transition. Otherwise, the transition can only be triggered by means of the API. ``` yaml diff --git a/docs/commerce/payment/extend_payment.md b/docs/commerce/payment/extend_payment.md index d50210bb5d..7c5a69c3af 100644 --- a/docs/commerce/payment/extend_payment.md +++ b/docs/commerce/payment/extend_payment.md @@ -5,9 +5,10 @@ edition: commerce # Extend Payment -There are different ways you can extend your Payment module implementation. -One of them is to create a custom payment method type. -The other is attaching custom data to a payment. +You can extend your Payment module implementation: + +- by creating a custom payment method type +- by attaching custom data to a payment You can also [customize the payment processing workflow](configure_payment.md#custom-payment-workflows). @@ -66,7 +67,7 @@ Then, register `OptionsFormMapper` a service: ### Create options validator -You might want to make sure that data provided by the user is validated. +You might want to make sure that data provided by the user is validated. To do that, create an options validator that checks user input against the constraints and dispatches an error when needed. ``` php diff --git a/docs/commerce/payment/payment_api.md b/docs/commerce/payment/payment_api.md index 0909cf85c1..4c5c90c414 100644 --- a/docs/commerce/payment/payment_api.md +++ b/docs/commerce/payment/payment_api.md @@ -7,10 +7,10 @@ edition: commerce To get payments and manage them, use the `Ibexa\Contracts\Payment\PaymentServiceInterface` interface. -By default, UUID is used to generate payment identifiers. +By default, UUID is used to generate payment identifiers. You can change that by providing a custom payment identifier in `Ibexa\Contracts\Payment\Payment\PaymentCreateStruct` or `Ibexa\Contracts\Payment\Payment\PaymentUpdateStruct`. -## Get single payment +## Get single payment ### Get single payment by ID @@ -30,7 +30,7 @@ To access a single payment by using its string identifier, use the `PaymentServi ## Get multiple payments -To fetch multiple payments, use the `PaymentServiceInterface::findPayments` method. +To fetch multiple payments, use the `PaymentServiceInterface::findPayments` method. It follows the same search query pattern as other APIs: ``` php @@ -39,8 +39,7 @@ It follows the same search query pattern as other APIs: ## Create payment -To create a payment, use the `PaymentServiceInterface::createPayment` method and provide it with -the `Ibexa\Contracts\Payment\Payment\PaymentCreateStruct` object that takes the following arguments: `method`, `order` and `amount`. +To create a payment, use the `PaymentServiceInterface::createPayment` method and provide it with the `Ibexa\Contracts\Payment\Payment\PaymentCreateStruct` object that takes the following arguments: `method`, `order` and `amount`. ``` php [[= include_file('code_samples/api/commerce/src/Command/PaymentCommand.php', 94, 94) =]] @@ -49,8 +48,8 @@ the `Ibexa\Contracts\Payment\Payment\PaymentCreateStruct` object that takes the ## Update payment -You can update payment information after the payment is created. -You could do it to support a scenario when, for example, an online payment failed, has been processed by using other means, and its status has to be updated in the system. +You can update payment information after the payment is created. +You could do it to support a scenario when, for example, an online payment failed, has been processed by using other means, and its status has to be updated in the system. The `Ibexa\Contracts\Payment\Payment\PaymentUpdateStruct` object takes the following arguments: `transition`, `identifier`, and `context`. To update payment information, use the `PaymentServiceInterface::updatePayment` method: @@ -61,6 +60,7 @@ To update payment information, use the `PaymentServiceInterface::updatePayment` ## Delete payment To delete a payment from the system, use the `PaymentServiceInterface::deletePayment` method: + ``` php [[= include_file('code_samples/api/commerce/src/Command/PaymentCommand.php', 114, 115) =]] ``` diff --git a/docs/commerce/payment/payment_method_api.md b/docs/commerce/payment/payment_method_api.md index c3e515a774..1edd74c98e 100644 --- a/docs/commerce/payment/payment_method_api.md +++ b/docs/commerce/payment/payment_method_api.md @@ -8,10 +8,10 @@ edition: commerce !!! tip "Order management REST API" To learn how to manage payment methods with the REST API, see the [REST API reference](../../api/rest_api/rest_api_reference/rest_api_reference.html#payment-methods). - + To get payment methods and manage them, use the `Ibexa\Contracts\Payment\PaymentMethodServiceInterface` interface. -From the developer's perspective, payment methods are referenced with identifiers defined manually at method creation stage in user interface. +From the developer's perspective, payment methods are referenced with identifiers defined manually at method creation stage in user interface. !!! note "Support for multilingual applications" @@ -39,7 +39,8 @@ To access a single payment method by using its numerical ID, use the `PaymentMet ## Get multiple payment methods -To fetch multiple payment methods, use the `PaymentMethodService::findPaymentMethods` method. +To fetch multiple payment methods, use the `PaymentMethodService::findPaymentMethods` method. + It follows the same search query pattern as other APIs: ``` php @@ -48,9 +49,14 @@ It follows the same search query pattern as other APIs: ## Create payment method -To create a payment method, use the `PaymentMethodService::createPaymentMethod` method and provide it with -an `Ibexa\Contracts\Payment\PaymentMethod\PaymentMethodCreateStruct` object that takes the following parameters: -`identifier` string, `type` TypeInterface object, `names` array of string values, `descriptions` array of string values, `enabled` boolean value, and an `options` object. +To create a payment method, use the `PaymentMethodService::createPaymentMethod` method and provide it with an `Ibexa\Contracts\Payment\PaymentMethod\PaymentMethodCreateStruct` object that takes the following parameters: + +- `identifier` string +- `type` TypeInterface object +- `names` array of string values +- `descriptions` array of string values +- `enabled` boolean value +- `options` object. ``` php [[= include_file('code_samples/api/commerce/src/Command/PaymentMethodCommand.php', 58, 59) =]][[= include_file('code_samples/api/commerce/src/Command/PaymentMethodCommand.php', 77, 87) =]] @@ -58,8 +64,9 @@ an `Ibexa\Contracts\Payment\PaymentMethod\PaymentMethodCreateStruct` object that ## Update payment method -You can update the payment method after it's created. +You can update the payment method after it's created. An `Ibexa\Contracts\Payment\PaymentMethod\PaymentMethodUpdateStruct` object can take the following arguments: `identifier` string, `names` array of string values, `descriptions` array of string values, `enabled` boolean value, and an `options` object. + To update payment method information, use the `PaymentMethodServiceInterface::updatePaymentMethod` method: ``` php @@ -76,6 +83,7 @@ To delete a payment method from the system, use the `PaymentMethodService::delet ## Check whether payment method is used To check whether a payment method is used, for example, before you delete it, use the `PaymentMethodService::isPaymentMethodUsed` method: + ``` php [[= include_file('code_samples/api/commerce/src/Command/PaymentMethodCommand.php', 109, 122) =]] ``` \ No newline at end of file diff --git a/docs/commerce/payment/payment_method_filtering.md b/docs/commerce/payment/payment_method_filtering.md index 0458e6b9ac..b26cf1903e 100644 --- a/docs/commerce/payment/payment_method_filtering.md +++ b/docs/commerce/payment/payment_method_filtering.md @@ -10,8 +10,8 @@ To allow this filtering, you need to create a custom payment method type and reg ## Create custom payment method type -There are different ways you can extend your Payment module implementation. -One of them is to [create a custom payment method type](extend_payment.md). +You can extend your Payment module implementation in different ways. +One of them is to [create a custom payment method type](extend_payment.md). The following example shows, how to create `New Payment Method Type`. diff --git a/docs/commerce/payment/payum_integration.md b/docs/commerce/payment/payum_integration.md index c6fd3fa5e3..8442337dba 100644 --- a/docs/commerce/payment/payum_integration.md +++ b/docs/commerce/payment/payum_integration.md @@ -27,7 +27,9 @@ payum: ## Workflow mapping In [[= product_name =]], the default payment workflow has certain places, such as `pending`, `failed`, `paid`, or `cancelled`, and their corresponding transitions. + However, for your application to use other transitions and places, for example, `authorized`, `notified`, `refunded` etc., and to present them in the user interface, you need to: + - override the default payment workflow - create a custom workflow and enable it by using semantic configuration diff --git a/docs/commerce/shipping_management/configure_shipment.md b/docs/commerce/shipping_management/configure_shipment.md index f6e13aa85f..14b9f71dd6 100644 --- a/docs/commerce/shipping_management/configure_shipment.md +++ b/docs/commerce/shipping_management/configure_shipment.md @@ -5,17 +5,16 @@ edition: commerce # Configure shipping -When you work with your Commerce implementation, you can review and modify -the shipping configuration. +When you work with your Commerce implementation, you can review and modify the shipping configuration. -!!! note "Permissions" +!!! note "Permissions" When you modify the workflow configuration, make sure you properly set user [permissions](permission_use_cases.md#commerce) for the shipping component. ## Configure shipment workflow Shipment workflow relies on a [Symfony Workflow]([[= symfony_doc =]]/components/workflow.html). -Each transition represents a separate shipment step. +Each transition represents a separate shipment step. The default fallback workflow is `ibexa_shipment`, which is prepended at bundle level. @@ -23,11 +22,11 @@ The default fallback workflow is `ibexa_shipment`, which is prepended at bundle The default payment workflow configuration is called `ibexa_shipment`, you can replace it with your custom workflow identifier if needed. -o see the default workflow, in your project directory, navigate to the following file: `vendor/Ibexa/shipping/src/bundle/Resources/config/workflow.yaml`. +To see the default workflow, in your project directory, navigate to the following file: `vendor/Ibexa/shipping/src/bundle/Resources/config/workflow.yaml`. ### Custom shipment workflows -You define custom workflow implementations under the `framework.workflows` [configuration key](configuration.md#configuration-files). +You define custom workflow implementations under the `framework.workflows` [configuration key](configuration.md#configuration-files). The `shipping.shipment_workflow` parameter is repository-aware. To customize your configuration, place it under the `framework.workflows.` [configuration key](configuration.md#configuration-files): diff --git a/docs/commerce/shipping_management/extend_shipping.md b/docs/commerce/shipping_management/extend_shipping.md index aa690df237..d33574333f 100644 --- a/docs/commerce/shipping_management/extend_shipping.md +++ b/docs/commerce/shipping_management/extend_shipping.md @@ -5,7 +5,8 @@ edition: commerce # Extend shipping -There are different ways in which you can extend or customize your Shipping module implementation. +You can extend or customize your Shipping module implementation in different ways. + Here, you can learn about the following ideas to make your Commerce solution more powerful: - create a custom shipping method type @@ -16,12 +17,12 @@ You can also [customize the shipment processing workflow](configure_shipment.md# ## Create custom shipping method type -If your application needs shipping methods of other type than the default ones, you can create custom shipping method types. +If your application needs shipping methods of other type than the default ones, you can create custom shipping method types. See the code samples below to learn how to do it. - + ### Define custom shipping method type class -Create a definition of the shipping method type. +Create a definition of the shipping method type. Use a built-in type factory to define the class in `config/services.yaml`: ``` yaml @@ -34,7 +35,7 @@ At this point a custom shipping method type should be visible on the **Create sh ### Create options form -To let users create shipping methods of a custom type within the user interface, you need a Symfony form type. +To let users create shipping methods of a custom type within the user interface, you need a Symfony form type. Create a `src/ShippingMethodType/Form/Type/CustomShippingMethodOptionsType.php` file with a form type. Next, define a name of the custom shipping method type in the file, by using the `getTranslationMessages` method. @@ -65,7 +66,7 @@ At this point you should be able to create a shipping method based on a custom s ### Create options validator -You might want to validate the data provided by the user against certain constraints. +You might want to validate the data provided by the user against certain constraints. Here, you create an options validator class that checks whether the user provided the `customer_identifier` value and dispatches an error when needed. Use the type factory to define a compound validator class in `config/services.yaml`: @@ -107,7 +108,7 @@ Then, register the storage converter as a service: [[= include_file('code_samples/front/shop/shipping/config/services.yaml', 0, 1) =]][[= include_file('code_samples/front/shop/shipping/config/services.yaml', 25, 28) =]] ``` -#### Storage definition +#### Storage definition Now, create a storage definition class and a corresponding schema. The table stores information specific for the custom shipping method type. @@ -118,7 +119,7 @@ The table stores information specific for the custom shipping method type. `CREATE TABLE ibexa_shipping_method_region_custom(id int auto_increment primary key, customer_id text, shipping_method_region_id int);` -Create a `src/ShippingMethodType/Storage/StorageDefinition.php` file with a storage definition: +Create a `src/ShippingMethodType/Storage/StorageDefinition.php` file with a storage definition: ``` php [[= include_file('code_samples/front/shop/shipping/src/ShippingMethodType/Storage/StorageDefinition.php') =]] @@ -152,7 +153,7 @@ Register the voter as a service: [[= include_file('code_samples/front/shop/shipping/config/services.yaml', 0, 1) =]][[= include_file('code_samples/front/shop/shipping/config/services.yaml', 31, 34) =]] ``` -## Display shipping method parameters in details view +## Display shipping method parameters in details view You can extend the default shipping method details view by making shipping method visible on the **Cost** tab. To do this, create a `src/ShippingMethodType/Cost/CustomCostFormatter.php` file with a formatter class: diff --git a/docs/commerce/shipping_management/shipment_api.md b/docs/commerce/shipping_management/shipment_api.md index 51a99dfa5b..961826a2d8 100644 --- a/docs/commerce/shipping_management/shipment_api.md +++ b/docs/commerce/shipping_management/shipment_api.md @@ -9,7 +9,7 @@ To get shipments and manage them, use the `Ibexa\Contracts\Shipping\ShipmentServ From the developer's perspective, shipments are referenced with a UUID identifier. -## Get single shipment +## Get single shipment ### Get single shipment by identifier @@ -29,7 +29,7 @@ To access a single shipment by using its numerical id, use the `ShipmentService: ## Get multiple shipments -To fetch multiple shipments, use the `ShipmentService::findShipments` method. +To fetch multiple shipments, use the `ShipmentService::findShipments` method. It follows the same search query pattern as other APIs: ``` php @@ -38,8 +38,7 @@ It follows the same search query pattern as other APIs: ## Create shipment -To create a shipment, use the `ShipmentService::createShipment` method and provide it with -an `Ibexa\Contracts\Shipping\Value\ShipmentCreateStruct` object that takes two parameters, a `shippingMethod` string and a `Money` object. +To create a shipment, use the `ShipmentService::createShipment` method and provide it with an `Ibexa\Contracts\Shipping\Value\ShipmentCreateStruct` object that takes two parameters, a `shippingMethod` string and a `Money` object. ``` php [[= include_file('code_samples/api/commerce/src/Command/ShipmentCommand.php', 101, 115) =]] @@ -47,8 +46,8 @@ an `Ibexa\Contracts\Shipping\Value\ShipmentCreateStruct` object that takes two p ## Update shipment -You can update the shipment after it's created. -You could do it to support a scenario when, for example, the shipment is processed offline and its status has to be updated in the system. +You can update the shipment after it's created. +You could do it to support a scenario when, for example, the shipment is processed offline and its status has to be updated in the system. To update shipment information, use the `ShipmentService::updateShipment` method: ``` php diff --git a/docs/commerce/shipping_management/shipping_method_api.md b/docs/commerce/shipping_management/shipping_method_api.md index ed387a19a3..b276ddcf84 100644 --- a/docs/commerce/shipping_management/shipping_method_api.md +++ b/docs/commerce/shipping_management/shipping_method_api.md @@ -7,7 +7,7 @@ edition: commerce To get shipping methods and manage them, use the `Ibexa\Contracts\Shipping\ShippingMethodServiceInterface` interface. -Shipping methods are referenced with identifiers defined manually at method creation stage in user interface. +Shipping methods are referenced with identifiers defined manually at method creation stage in user interface. ## Get shipping method @@ -31,7 +31,7 @@ The method takes a string as `$id` parameter and uses a prioritized language fro ## Get multiple shipping methods -To fetch multiple shipping methods, use the `ShippingMethodServiceInterface::getShippingMethod` method. +To fetch multiple shipping methods, use the `ShippingMethodServiceInterface::getShippingMethod` method. It follows the same search query pattern as other APIs: ``` php diff --git a/docs/commerce/storefront/configure_storefront.md b/docs/commerce/storefront/configure_storefront.md index 0c9e58f4be..e291ad6ea8 100644 --- a/docs/commerce/storefront/configure_storefront.md +++ b/docs/commerce/storefront/configure_storefront.md @@ -8,9 +8,9 @@ The Storefront is accessible under the `/product-catalog`. ## Catalog configuration -With the `ibexa/storefront` package, you can configure the product catalog and make it available to your shop users. +With the `ibexa/storefront` package, you can configure the product catalog and make it available to your shop users. -Before you start configuring the Storefront, make sure you have created, configured and published [catalogs](https://doc.ibexa.co/projects/userguide/en/latest/pim/work_with_catalogs/#create-catalogs) in the back office. +Before you start configuring the Storefront, make sure you have created, configured, and published [catalogs](https://doc.ibexa.co/projects/userguide/en/latest/pim/work_with_catalogs/#create-catalogs) in the back office. The configuration is available under the `ibexa.system..storefront.catalog` [configuration key](configuration.md#configuration-files). It accepts the following values: @@ -96,7 +96,7 @@ ibexa: site_group: user_settings_groups: - location - - custom_group + - custom_group ``` By default, only the `location` user settings is provided: @@ -106,4 +106,3 @@ By default, only the `location` user settings is provided: - Short date and time format - Long date and time format - Language - diff --git a/docs/commerce/storefront/extend_storefront.md b/docs/commerce/storefront/extend_storefront.md index ddd6b29b3f..d82b43a8fd 100644 --- a/docs/commerce/storefront/extend_storefront.md +++ b/docs/commerce/storefront/extend_storefront.md @@ -11,9 +11,9 @@ With the `ibexa\storefront` package come the following built-in menus: | Item | Value | Description | |------------|----------|---------| -| [Breadcrumbs](#breadcrumbs-menu)| - | Renders breadcrumbs for content tree Root, Taxonomy Entry, Product, User settings and User settings group | -| [Taxonomy](#taxonomy-menu)| - | It can render a menu for product categories or tags | -| Currency| `currency_menu` | Renders a menu to change the active currency | +| [Breadcrumbs](#breadcrumbs-menu)| - | Renders breadcrumbs for content tree Root, Taxonomy Entry, product, user settings, and user settings group | +| [Taxonomy](#taxonomy-menu)| - | It can render a menu for product categories or tags | +| Currency| `currency_menu` | Renders a menu to change the active currency | | Language| `language_menu` | Renders a menu to change the active language | | Region | `region_menu` | Renders a menu to change the active region | @@ -56,8 +56,8 @@ See the usage example: ```html+twig {% set categories_menu = knp_menu_get( - 'ibexa_storefront.menu.taxonomy', - [], + 'ibexa_storefront.menu.taxonomy', + [], { parent: category, depth: 3 diff --git a/docs/commerce/storefront/storefront.md b/docs/commerce/storefront/storefront.md index bd2e3e5c22..5eac432f3e 100644 --- a/docs/commerce/storefront/storefront.md +++ b/docs/commerce/storefront/storefront.md @@ -6,8 +6,7 @@ edition: commerce # Storefront The Storefront package provides a starting kit for the developers. -It's a set of components that serves as a basis, which developers can -customize and extend to create their own implementation of a web store. +It's a set of components that serves as a basis, which developers can customize and extend to create their own implementation of a web store. ## Default UI components @@ -26,9 +25,9 @@ You can modify them when you build your own web store. | Mini cart widget | Consists of a counter that displays a total number of items added to a cart. | |Orders list|Displays a list of orders with such information as status, date, value, order ID. | | Product category page | Displays products that belong to a specific category. | -| Product filters component | Allows for narrowing the list of products displayed in the listing by using different filters, such as product type, availability and price. | +| Product filters component | Allows for narrowing the list of products displayed in the listing by using different filters, such as product type, availability, and price. | | Product listing page | Allows for browsing through products, displays product name, code, price, and image. | -| Region menu | Enables selecting between regions, to dynamically change the contents of the product listing page. | +| Region menu | Enables selecting between regions, to dynamically change the contents of the product listing page. | | Reorder |Allows logged-in users to repurchase previously bought items. | |Searching and filtering of orders| Allows logged-in users to search and filter their past orders on the orders page.| | Search for specific product component | Allows for searching for products, for example on the product listing page. | diff --git a/docs/commerce/transactional_emails/extend_transactional_emails.md b/docs/commerce/transactional_emails/extend_transactional_emails.md index 39f1c56e2b..665ed1cb9a 100644 --- a/docs/commerce/transactional_emails/extend_transactional_emails.md +++ b/docs/commerce/transactional_emails/extend_transactional_emails.md @@ -34,7 +34,7 @@ If this list isn't sufficient, you can use Events to include additional variable contentService->loadVersionInfo($contentInfo, 2); `loadRelations` provides an array of [`Relation`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Relation.html) objects. `Relation` has two main properties: `destinationContentInfo`, and `sourceContentInfo`. -It also holds the [relation type](content_relations.md), -and the optional Field this relation is made with. +It also holds the [relation type](content_relations.md), and the optional field this relation is made with. ### Owning user @@ -128,14 +118,11 @@ You can use the `getOwner` method of the `ContentInfo` object to load the conten [[= include_file('code_samples/api/public_php_api/src/Command/ViewContentMetaDataCommand.php', 108, 109) =]] ``` -To get the creator of the current version and not the content item's owner, -you need to use the `creatorId` property from the current version's `VersionInfo` object. +To get the creator of the current version and not the content item's owner, you need to use the `creatorId` property from the current version's `VersionInfo` object. ### Section -You can find the Section to which a content item belongs through -the [`getSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html#method_getSection) method -of the ContentInfo object: +You can find the Section to which a content item belongs through the [`getSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentInfo.html#method_getSection) method of the ContentInfo object: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/ViewContentMetaDataCommand.php', 111, 112) =]] @@ -148,8 +135,7 @@ of the ContentInfo object: ### Object states -You can retrieve [Object states](object_states.md) of a content item -using [`ObjectStateService::getContentState`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_getContentState). +You can retrieve [Object states](object_states.md) of a content item using [`ObjectStateService::getContentState`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_getContentState). You need to provide it with the Object state group. All Object state groups can be retrieved through [`loadObjectStateGroups`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_loadObjectStateGroups). @@ -157,9 +143,9 @@ All Object state groups can be retrieved through [`loadObjectStateGroups`](../.. [[= include_file('code_samples/api/public_php_api/src/Command/ViewContentMetaDataCommand.php', 114, 119) =]] ``` -## Viewing content with Fields +## Viewing content with fields -To retrieve the Fields of the selected content item, you can use the following command: +To retrieve the fields of the selected content item, you can use the following command: ```php hl_lines="13-14 16-22" [[= include_file('code_samples/api/public_php_api/src/Command/ViewContentCommand.php', 4, 7) =]] // ... @@ -170,12 +156,12 @@ To retrieve the Fields of the selected content item, you can use the following c Line 9 shows how [`ContentService::loadContent`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentService.html#method_loadContent) loads the content item provided to the command. Line 14 makes use of the [`ContentTypeService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentTypeService.html) to retrieve the content type of the requested item. -Lines 12-19 iterate over Fields defined by the content type. -For each Field they print out its identifier, and then using [`FieldTypeService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-FieldTypeService.html) retrieve the Field's value and print it out to the console. +Lines 12-19 iterate over fields defined by the content type. +For each field they print out its identifier, and then using [`FieldTypeService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-FieldTypeService.html) retrieve the field's value and print it out to the console. ## Viewing content in different languages -The Repository is SiteAccess-aware, so languages defined by the SiteAccess are automatically taken into account when loading content. +The repository is SiteAccess-aware, so languages defined by the SiteAccess are automatically taken into account when loading content. To load a specific language, provide its language code when loading the content item: @@ -191,8 +177,7 @@ $contentService->loadContent($content->id, Language::ALL); ## Getting all content in a subtree -To go through all the content items contained in a subtree, -you need to use the [`LocationService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html). +To go through all the content items contained in a subtree, you need to use the [`LocationService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html). ``` php hl_lines="5 15" [[= include_file('code_samples/api/public_php_api/src/Command/BrowseLocationsCommand.php', 30, 49) =]] @@ -200,41 +185,38 @@ you need to use the [`LocationService`](../../api/php_api/php_api_reference/clas `loadLocation` (line 15) returns a value object, here a `Location`. -[`LocationService::loadLocationChildren`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_loadLocationChildren) (line 5) -returns a [`LocationList`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LocationList.html) value object that you can iterate over. +[`LocationService::loadLocationChildren`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-LocationService.html#method_loadLocationChildren) (line 5) returns a [`LocationList`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-LocationList.html) value object that you can iterate over. !!! note Refer to [Searching](search_api.md) for information on more complex search queries. -## Getting parent Location +## Getting parent location -To get the parent Location of content, you first need to determine which Location is the main one, -in case the content item has multiple Locations. +To get the parent location of content, you first need to determine which location is the main one, in case the content item has multiple locations. You can do it through the `getMainLocation` method of the ContentInfo object. -Next, use the `getParentLocation` method of the Location object to access the parent Location: +Next, use the `getParentLocation` method of the location object to access the parent location: ``` php $mainLocation = $contentInfo->getMainLocation(); $output->writeln("Parent Location: " . $mainLocation->getParentLocation()->pathString); ``` -## Getting content from a Location +## Getting content from a location -When dealing with Location objects (and Trash objects), you can get access to content item directly using `$location->getContent`. +When dealing with location objects (and Trash objects), you can get access to content item directly using `$location->getContent`. In Twig this can also be accessed by `location.content`. - -This is a lazy property. It triggers loading of content when first used. -In case of bulk of Locations coming from Search or Location Service, -the content is also loaded in bulk for the whole Location result set. +It triggers loading of content when first used. +In case of bulk of locations coming from Search or Location Service, +the content is also loaded in bulk for the whole location result set. ## Comparing content versions You can compare two versions of a content item using the `VersionComparisonService`. The versions must have the same language. -For example, to get the comparison between the `name` Field of two versions: +For example, to get the comparison between the `name` field of two versions: ```php $versionFrom = $this->contentService->loadVersionInfo($contentInfo, $versionFromId); @@ -244,7 +226,6 @@ $nameComparison = $this->comparisonService->compare($versionFrom, $versionTo)->g ``` `getComparisonResult` returns a `ComparisonResult` object, which depends on the field type being compared. -In the example of a Text Line (ezstring) Field, it's an array of `StringDiff` objects. +In the example of a Text Line (ezstring) field, it's an array of `StringDiff` objects. -Each diff contains a section of the Field to compare (e.g. a part of a text line) -and its status, which can be "unchanged", "added" or "removed". +Each diff contains a section of the field to compare (e.g. a part of a text line) and its status, which can be "unchanged", "added" or "removed". diff --git a/docs/content_management/content_api/creating_content.md b/docs/content_management/content_api/creating_content.md index c8c381a5ad..ce3f920b6c 100644 --- a/docs/content_management/content_api/creating_content.md +++ b/docs/content_management/content_api/creating_content.md @@ -25,14 +25,14 @@ returns a new [`ContentCreateStruct`](../../api/php_api/php_api_reference/classe ``` This command creates a draft using [`ContentService::createContent`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentService.html#method_createContent) (line 7). -This method must receive a `ContentCreateStruct` and an array of Location structs. +This method must receive a `ContentCreateStruct` and an array of location structs. `ContentCreateStruct` (which extends `ContentStruct`) is created through [`ContentService::newContentCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ContentService.html#method_newContentCreateStruct) (line 2), which receives the content type and the primary language for the content item. For information about translating a content item into other languages, see [Translating content](#translating-content). -[`ContentStruct::setField`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentStruct.html#method_setField) (line 3) enables you to define the Field values. -When the Field accepts a simple value, you can provide it directly, as in the example above. +[`ContentStruct::setField`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentStruct.html#method_setField) (line 3) enables you to define the field values. +When the field accepts a simple value, you can provide it directly, as in the example above. For some field types, for example [images](#creating-an-image), you need to provide an instance of a Value type. ### Creating an image @@ -49,8 +49,8 @@ Value of the Image field type contains the path to the image file and other basi ### Creating content with RichText -The RichText Field accepts values in a custom flavor of [Docbook](https://github.com/docbook/wiki/wiki) format. -For example, to add a simple RichText paragraph, provide the following as input: +The RichText field accepts values in a custom flavor of [Docbook](https://github.com/docbook/wiki/wiki) format. +For example, to add a RichText paragraph, provide the following as input: ``` xml
Description of your content item.
diff --git a/docs/content_management/content_api/managing_content.md b/docs/content_management/content_api/managing_content.md index 4bb52490ba..65e5c16ffa 100644 --- a/docs/content_management/content_api/managing_content.md +++ b/docs/content_management/content_api/managing_content.md @@ -134,7 +134,7 @@ $newParent = $this->locationService->loadLocation($location); $this->trashService->recover($trashItem, $newParent); ``` -You can also search through Trash items and sort the results using several public PHP API search criteria and sort clauses that have been exposed for `TrashService` queries. +You can also search through Trash items and sort the results using several public PHP API Search Criteria and Sort Clauses that have been exposed for `TrashService` queries. For more information, see [Searching in trash](search_api.md#searching-in-trash). ## Content types @@ -150,13 +150,13 @@ To operate on content types, you need to make use of [`ContentTypeService`](../. Adding a new content type, like creating content, must happen with the use of a struct, because a content type value object is read-only. In this case you use [`ContentTypeCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-ContentType-ContentTypeCreateStruct.html). -A content type must have at least one name, in the main language, and at least one Field definition. +A content type must have at least one name, in the main language, and at least one field definition. ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CreateContentTypeCommand.php', 59, 69) =]][[= include_file('code_samples/api/public_php_api/src/Command/CreateContentTypeCommand.php', 76, 85) =]] ``` -You can specify more details of the Field definition in the create struct, for example: +You can specify more details of the field definition in the create struct, for example: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CreateContentTypeCommand.php', 67, 77) =]] @@ -196,7 +196,7 @@ You need to provide the method with an EventQuery, which takes a date range and [[= include_file('code_samples/api/public_php_api/src/Command/CalendarCommand.php', 39, 50) =]] ``` -You can also get the first and last event in the list by using the `first()` and `last()` methods of an `EventCollection` (`Ibexa\Contracts\Calendar\EventCollection`) respectively: +You can also get the first and last event in the list by using the `first()` and `last()` methods of an `EventCollection` (`Ibexa\Contracts\Calendar\EventCollection`): ``` php [[= include_file('code_samples/api/public_php_api/src/Command/CalendarCommand.php', 51, 53) =]] diff --git a/docs/content_management/content_management.md b/docs/content_management/content_management.md index 86909c5451..70ed241b9e 100644 --- a/docs/content_management/content_management.md +++ b/docs/content_management/content_management.md @@ -14,5 +14,5 @@ page_type: landing_page "content_management/forms/forms", "content_management/taxonomy/taxonomy", "content_management/workflow/workflow", - "content_management/data_migration/data_migration", + "content_management/data_migration/data_migration" ], columns=4) =]] diff --git a/docs/content_management/content_management_api/bookmark_api.md b/docs/content_management/content_management_api/bookmark_api.md index f85d0e0cb2..8f177a8db0 100644 --- a/docs/content_management/content_management_api/bookmark_api.md +++ b/docs/content_management/content_management_api/bookmark_api.md @@ -4,8 +4,7 @@ description: You can use the PHP API to view the bookmark list, and add or remov # Bookmark API -[`BookmarkService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-BookmarkService.html) -enables you to read, add and remove bookmarks from content. +[`BookmarkService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-BookmarkService.html) enables you to read, add and remove bookmarks from content. !!! tip "Bookmark REST API" @@ -17,8 +16,7 @@ To view a list of all bookmarks, use [`BookmarkService::loadBookmarks`](../../ap [[= include_file('code_samples/api/public_php_api/src/Command/BookmarkCommand.php', 43, 50) =]] ``` -You can add a bookmark to a content item by providing its Location object -to the [`BookmarkService::createBookmark`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-BookmarkService.html#method_createBookmark) method: +You can add a bookmark to a content item by providing its Location object to the [`BookmarkService::createBookmark`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-BookmarkService.html#method_createBookmark) method: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/BookmarkCommand.php', 37, 40) =]] diff --git a/docs/content_management/content_management_api/object_state_api.md b/docs/content_management/content_management_api/object_state_api.md index 28d0a73b0a..c89b79ead7 100644 --- a/docs/content_management/content_management_api/object_state_api.md +++ b/docs/content_management/content_management_api/object_state_api.md @@ -15,8 +15,7 @@ You can manage Object states by using the PHP API by using `ObjectStateService`. ## Getting Object state information -You can use the [`ObjectStateService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html) -to get information about Object state groups or Object states. +You can use the [`ObjectStateService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html) to get information about Object state groups or Object states. ``` php [[= include_file('code_samples/api/public_php_api/src/Command/ObjectStateCommand.php', 48, 53) =]] @@ -24,20 +23,15 @@ to get information about Object state groups or Object states. ## Creating Object states -To create an Object state group and add Object states to it, -you need to make use of the [`ObjectStateService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html): +To create an Object state group and add Object states to it, you need to make use of the [`ObjectStateService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html): ``` php [[= include_file('code_samples/api/public_php_api/src/Command/ObjectStateCommand.php', 57, 61) =]] ``` -[`ObjectStateService::createObjectStateGroup`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_createObjectStateGroup) -takes as argument an [`ObjectStateGroupCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-ObjectState-ObjectStateGroupCreateStruct.html), -in which you need to specify the identifier, default language and at least one name for the group. +[`ObjectStateService::createObjectStateGroup`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_createObjectStateGroup) takes as argument an [`ObjectStateGroupCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-ObjectState-ObjectStateGroupCreateStruct.html), in which you need to specify the identifier, default language and at least one name for the group. -To create an Object state inside a group, -use [`ObjectStateService::newObjectStateCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_newObjectStateCreateStruct) -and provide it with an `ObjectStateCreateStruct`: +To create an Object state inside a group, use [`ObjectStateService::newObjectStateCreateStruct`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_newObjectStateCreateStruct) and provide it with an `ObjectStateCreateStruct`: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/ObjectStateCommand.php', 63, 67) =]] @@ -45,8 +39,7 @@ and provide it with an `ObjectStateCreateStruct`: ## Assigning Object state -To assign an Object state to a content item, -use [`ObjectStateService::setContentState`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_setContentState). +To assign an Object state to a content item, use [`ObjectStateService::setContentState`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-ObjectStateService.html#method_setContentState). Provide it with a `ContentInfo` object of the content item, the Object state group and the Object state: ``` php diff --git a/docs/content_management/content_management_api/section_api.md b/docs/content_management/content_management_api/section_api.md index 853b8115cc..3abb9cde5d 100644 --- a/docs/content_management/content_management_api/section_api.md +++ b/docs/content_management/content_management_api/section_api.md @@ -40,14 +40,13 @@ You can also use the query to get the total number of assigned content items: [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 69, 75) =]][[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 82, 86) =]] ``` -## Assigning Section to content +## Assigning section to content -To assign content to a Section, use the [`SectionService::assignSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SectionService.html#method_assignSection) method. -You need to provide it with the `ContentInfo` object of the content item, -and the [`Section`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Section.html) object: +To assign content to a section, use the [`SectionService::assignSection`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SectionService.html#method_assignSection) method. +You need to provide it with the `ContentInfo` object of the content item, and the [`Section`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Section.html) object: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/SectionCommand.php', 64, 67) =]] ``` -Assigning a Section to content does not automatically assign it to the content item's children. +Assigning a section to content does not automatically assign it to the content item's children. diff --git a/docs/content_management/content_management_guide.md b/docs/content_management/content_management_guide.md index 454db47c16..4f79454b8d 100644 --- a/docs/content_management/content_management_guide.md +++ b/docs/content_management/content_management_guide.md @@ -64,7 +64,7 @@ Their role is to: - store data - validate input data - make the data searchable -- display Fields of a given field type +- display fields of a given field type For a complete list of available field types, see [field type reference](field_type_reference.md). @@ -72,7 +72,7 @@ For a complete list of available field types, see [field type reference](field_t ### Fields -Once you use a field type to design and build a content type definition, and define its settings, it becomes a Field. +Once you use a field type to design and build a content type definition, and define its settings, it becomes a field. Fields can be as simple as Name, based on a Text line field type, or as complex as Page, based on a landing page field type, with multiple options to set and choose from: @@ -81,7 +81,7 @@ Fields can be as simple as Name, based on a Text line field type, or as complex ### Content types Life gets easier when you have templates to fill in with content. Content types are such templates, which editors use to create content items. -Content types define what Fields are available in the content item. +Content types define what fields are available in the content item. [[= product_name =]] comes with several basic content types, and creating new ones, editing, and deleting them is done by using a visual interface, with no coding skills needed. @@ -90,9 +90,9 @@ Content types define what Fields are available in the content item. ### Content items Content items are pieces of content, such as, for example, products, articles, blog posts, or media. -In [[= product_name =]], everything is a content item — not just pages, articles or products, but also all media (images, videos, etc.) or even user accounts. +In [[= product_name =]], everything is a content item — not only pages, articles or products, but also all media (images, videos, etc.) or even user accounts. -Each content item, apart from its name and identifier, contains a composition of Fields, which differs depending on the type of content. +Each content item, apart from its name and identifier, contains a composition of fields, which differs depending on the type of content. For example, articles might have a title, an author, a body, and an image, while products may have a name, category, price, size, color, etc. ### Forms @@ -208,7 +208,7 @@ Although segments aren't meant to classify content, they could fall into this ca With segments, you can reach specific groups, or categories, of visitors with specific information about content or products that could be of their interest. For example, you can build Pages that contain different recommendations, depending on who is visiting them. -![A Segment Group with two user segments](img/user_segments.png) +![A segment group with two user segments](img/user_segments.png) ## How to get started @@ -221,7 +221,7 @@ Since content management is an ongoing process, and, in your implementation, you Any content that you might want to deliver to a viewer can be structured and split into smaller elements. Reverse-engineer the intended concepts into individual fields, which can be categorized, and then picked from categories and combined into content items. -Reuse existing Fields Types or [customize them to fit your needs](create_custom_generic_field_type.md), then [create content types]([[= user_doc =]]/content_management/create_edit_content_items/). +Reuse existing fields types or [customize them to fit your needs](create_custom_generic_field_type.md), then [create content types]([[= user_doc =]]/content_management/create_edit_content_items/). **2\. Define permissions** @@ -229,7 +229,7 @@ Although this step isn't directly related to content management, it's a good tim **3\. Author content** -[Create various content items]([[= user_doc =]]/content_management/create_edit_content_items/), such as pages, articles, forms, or media. While you fill Fields with content, several actions are there to help you with your task. +[Create various content items]([[= user_doc =]]/content_management/create_edit_content_items/), such as pages, articles, forms, or media. While you fill fields with content, several actions are there to help you with your task. You can pause and resume the work, preview the results, or send content for review. ![Send to review](img/send_to_review.png) diff --git a/docs/content_management/content_relations.md b/docs/content_management/content_relations.md index 19de54b0d2..29ec913759 100644 --- a/docs/content_management/content_relations.md +++ b/docs/content_management/content_relations.md @@ -1,5 +1,5 @@ --- -description: Content Relations control links between different content items, either created explicitly or by linking inside RichText Fields. +description: Content Relations control links between different content items, either created explicitly or by linking inside RichText fields. --- # Content Relations @@ -13,20 +13,20 @@ A **Relation** can exist between any two content items in the repository. For example, images are linked to news articles they're used in. Instead of using a fixed set of image attributes, the images are stored as separate content items outside the article. -There are different types of Relations available in the system. -Content can have Relations on item or on Field level. +In the system you can find different types of Relations. +Content can have Relations on item or on field level. *Relations at Field level* are created using one of two special field types: Content relation (single) and Content relations (multiple). -These Fields allow you to select one or more other content items in the Field value, which are linked to these Fields. +These fields allow you to select one or more other content items in the field value, which are linked to these fields. *Relations at content item level* can be of three different types: - *Common Relations* are created between two content items using the public PHP API. -- *RichText linked Relations* are created using a Field of the RichText type. -When an internal link (a link to another Location or content item) is placed in a RichText Field, +- *RichText linked Relations* are created using a field of the RichText type. +When an internal link (a link to another Location or content item) is placed in a RichText field, the system automatically creates a Relation. The Relation is automatically removed from the system when the link is removed from the content item. -- *RichText embedded Relations* also use a RichText Field. -When an Embed element is placed in a RichText Field, the system automatically creates a Relation -between the embedded content item and the one with the RichText Field. +- *RichText embedded Relations* also use a RichText field. +When an Embed element is placed in a RichText field, the system automatically creates a Relation +between the embedded content item and the one with the RichText field. The Relation is automatically removed from the system when the link is removed from the content item. diff --git a/docs/content_management/field_types/create_custom_field_type_comparison.md b/docs/content_management/field_types/create_custom_field_type_comparison.md index 30585b91c0..7a3a036a9f 100644 --- a/docs/content_management/field_types/create_custom_field_type_comparison.md +++ b/docs/content_management/field_types/create_custom_field_type_comparison.md @@ -1,11 +1,11 @@ --- -description: Enable comparison of content Fields based on a custom field type. +description: Enable comparison of content fields based on a custom field type. --- # Create custom field type comparison -In the back office, you can compare the contents of Fields. -Comparing is possible only between two versions of the same Field that are in the same language. +In the back office, you can compare the contents of fields. +Comparing is possible only between two versions of the same field that are in the same language. You can add the possibility to compare custom and other unsupported field types. @@ -42,7 +42,7 @@ Next, create a `src/FieldType/HelloWorld/Comparison/Value.php` file that holds t ## Create comparison engine -The comparison engine handles the operations required for comparing the contents of Fields. +The comparison engine handles the operations required for comparing the contents of fields. Each field type requires a separate comparison engine, which implements the `Ibexa\Contracts\VersionComparison\Engine\FieldTypeComparisonEngine` interface. For the "Hello World" field type, create the following comparison engine based on the engine for the TextLine field type. diff --git a/docs/content_management/field_types/create_custom_generic_field_type.md b/docs/content_management/field_types/create_custom_generic_field_type.md index 54a507bd1f..835085a9f2 100644 --- a/docs/content_management/field_types/create_custom_generic_field_type.md +++ b/docs/content_management/field_types/create_custom_generic_field_type.md @@ -58,7 +58,7 @@ It enables you to edit the new field type. [[= include_file('code_samples/field_types/generic_ft/src/Form/Type/HelloWorldType.php') =]] ``` -Now you can map Field definitions into Symfony forms with FormMapper. +Now you can map field definitions into Symfony forms with FormMapper. Add the `mapFieldValueForm()` method required by `FieldValueFormMapperInterface` and the required `use` statements to `src/FieldType/HelloWorld/Type.php`: diff --git a/docs/content_management/field_types/customize_field_type_metadata.md b/docs/content_management/field_types/customize_field_type_metadata.md index d237f54cd0..9a8fdf2fde 100644 --- a/docs/content_management/field_types/customize_field_type_metadata.md +++ b/docs/content_management/field_types/customize_field_type_metadata.md @@ -4,13 +4,13 @@ description: You can customize which field type metadata should be disabled in t # Customize field type metadata -When creating a content type definition, you add Fields and configure their metadata, +When creating a content type definition, you add fields and configure their metadata, such as whether they're required, translatable, and so on. If needed, you can customize that some of those options are disabled in the back office for specific field types. -To do this, add custom service definition for `ModifyFieldDefinitionsCollectionTypeExtension` +To do this, add custom service definition for `ModifyFieldDefinitionsCollectionTypeExtension`. -For example, this configuration means that no Image Field can be set as required in the definition of a content type: +For example, this configuration means that no Image field can be set as required in the definition of a content type: ``` yaml services: @@ -28,9 +28,9 @@ services: `modifiedOptions` lists the changes you want to make. The following options are available: -- `disable_identifier_field` - disables changing the Field identifier -- `disable_required_field` - disables setting the Field as required -- `disable_translatable_field` - disables setting the Field as translatable -- `disable_remove` - disables removing the Field from content type definition (after it has been saved) +- `disable_identifier_field` - disables changing the field identifier +- `disable_required_field` - disables setting the field as required +- `disable_translatable_field` - disables setting the field as translatable +- `disable_remove` - disables removing the field from content type definition (after it has been saved) -![Image Field with disabled required option](disable-required-field.png) +![Image field with disabled required option](disable-required-field.png) diff --git a/docs/content_management/field_types/field_type_reference/addressfield.md b/docs/content_management/field_types/field_type_reference/addressfield.md index 604cb4c6c6..a9d82c4622 100644 --- a/docs/content_management/field_types/field_type_reference/addressfield.md +++ b/docs/content_management/field_types/field_type_reference/addressfield.md @@ -1,7 +1,7 @@ # Address field type -This Field represents and handles address fields. -It allows you to customize address Fields per country. +This field represents and handles address fields. +It allows you to customize address fields per country. | Name | Internal name | Expected input | |-----------|-----------------|-----------------------------| @@ -67,7 +67,7 @@ formats: - postal_code ``` -#### Modifying Field configuration +#### Modifying field configuration ```yaml formats: diff --git a/docs/content_management/field_types/field_type_reference/binaryfilefield.md b/docs/content_management/field_types/field_type_reference/binaryfilefield.md index f5cf63ee51..54a912a262 100644 --- a/docs/content_management/field_types/field_type_reference/binaryfilefield.md +++ b/docs/content_management/field_types/field_type_reference/binaryfilefield.md @@ -59,11 +59,11 @@ To use a remote file, you have to download it locally first, then remove it afte ## REST API specifics -Used in the REST API, a BinaryFile Field mostly serializes the hash described above. However there are a couple specifics worth mentioning. +Used in the REST API, a BinaryFile field mostly serializes the hash described above. However there are a couple specifics worth mentioning. ### Reading content: `url` property -When reading the contents of a Field of this type, an extra key is added: `url`. This key gives you the absolute file URL, protocol and host included. +When reading the contents of a field of this type, an extra key is added: `url`. This key gives you the absolute file URL, protocol and host included. Example: `http://example.com/var/ezdemo_site/storage/original/application/63cd472dd7819da7b75e8e2fee507c68.pdf` diff --git a/docs/content_management/field_types/field_type_reference/contentqueryfield.md b/docs/content_management/field_types/field_type_reference/contentqueryfield.md index fc752e2419..b7ef3d27d2 100644 --- a/docs/content_management/field_types/field_type_reference/contentqueryfield.md +++ b/docs/content_management/field_types/field_type_reference/contentqueryfield.md @@ -1,6 +1,6 @@ # Content query field type -This field type maps an executable repository query to a Field. +This field type maps an executable repository query to a field. | Name | Internal name | Expected input | |-----------|---------------|----------------| diff --git a/docs/content_management/field_types/field_type_reference/countryfield.md b/docs/content_management/field_types/field_type_reference/countryfield.md index 099b42ecdb..d44bbf1247 100644 --- a/docs/content_management/field_types/field_type_reference/countryfield.md +++ b/docs/content_management/field_types/field_type_reference/countryfield.md @@ -23,15 +23,15 @@ Example array: ]; ``` -When you set an array directly on a Content Field you don't need to provide all this information, the field type assumes it's a hash and in this case accepts a simplified structure described below under [Hash format](#hash-format). +When you set an array directly on a content field you don't need to provide all this information, the field type assumes it's a hash and in this case accepts a simplified structure described below under [Hash format](#hash-format). ### Validation -This field type validates whether multiple countries are allowed by the Field definition, and whether the [Alpha2](https://www.iso.org/iso-3166-country-codes.html) is valid according to the countries configured in [[= product_name =]]. +This field type validates whether multiple countries are allowed by the field definition, and whether the [Alpha2](https://www.iso.org/iso-3166-country-codes.html) is valid according to the countries configured in [[= product_name =]]. ### Settings -The Field definition of this field type can be configured with one option: +The field definition of this field type can be configured with one option: | Name | Type | Default value | Description| |--------------|-----------|---------------|------------| @@ -46,7 +46,7 @@ $settings = [ ### Hash format -The format used for serialization is simpler than the full format. It's also available when setting value on the content Field, by setting the value to an array instead of the Value object. Example of that shown below: +The format used for serialization is simpler than the full format. It's also available when setting value on the content field, by setting the value to an array instead of the Value object. Example of that shown below: ``` php // Value object content example diff --git a/docs/content_management/field_types/field_type_reference/customergroupfield.md b/docs/content_management/field_types/field_type_reference/customergroupfield.md index ba6e694690..6cd3d118dd 100644 --- a/docs/content_management/field_types/field_type_reference/customergroupfield.md +++ b/docs/content_management/field_types/field_type_reference/customergroupfield.md @@ -1,4 +1,4 @@ -# Customer group Field +# Customer group field This field type represents a customer group that a user belongs to. diff --git a/docs/content_management/field_types/field_type_reference/dateandtimefield.md b/docs/content_management/field_types/field_type_reference/dateandtimefield.md index 4535563975..f8a7c7108b 100644 --- a/docs/content_management/field_types/field_type_reference/dateandtimefield.md +++ b/docs/content_management/field_types/field_type_reference/dateandtimefield.md @@ -72,12 +72,12 @@ This field type does not perform any special validation of the input value. ### Settings -The Field definition of this field type can be configured with several options: +The field definition of this field type can be configured with several options: |Name|Type|Default value|Description| |------|------|------|------| |`useSeconds`|`boolean`|`false`|Used to control displaying of seconds in the output.| -|`defaultType`|`mixed`|`Type::DEFAULT_EMPTY`|One of the `DEFAULT_*` constants, used by the administration interface for setting the default Field value. See below for more details.| +|`defaultType`|`mixed`|`Type::DEFAULT_EMPTY`|One of the `DEFAULT_*` constants, used by the administration interface for setting the default field value. See below for more details.| |`dateInterval`|`null|\DateInterval`|`null`|This setting complements `defaultType` setting and can be used only when the latter is set to `Type::DEFAULT_CURRENT_DATE_ADJUSTED`. In that case the default input value when using administration interface is adjusted by the given `\DateInterval`.| Following `defaultType` default value options are available as constants in the `Ibexa\Core\FieldType\DateAndTime\Type` class: @@ -102,11 +102,11 @@ $settings = [ ## Template rendering -The template called by the [`ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date Field has access to the following parameters: +The template called by the [`ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date field has access to the following parameters: | Parameter | Type | Default | Description| |-----------|----------|---------|------------| -| `locale` | `string` |   n/a | Internal parameter set by the system based on current request locale or if not set calculated based on the language of the Field. | +| `locale` | `string` |   n/a | Internal parameter set by the system based on current request locale or if not set calculated based on the language of the field. | Example: diff --git a/docs/content_management/field_types/field_type_reference/datefield.md b/docs/content_management/field_types/field_type_reference/datefield.md index 8d25bd3e7f..982b29d40e 100644 --- a/docs/content_management/field_types/field_type_reference/datefield.md +++ b/docs/content_management/field_types/field_type_reference/datefield.md @@ -74,11 +74,11 @@ This field type does not perform any special validation of the input value. ### Settings -The Field definition of this field type can be configured with a single option: +The field definition of this field type can be configured with a single option: |Name|Type|Default value|Description| |------|------|------|------| -|`defaultType`|`mixed`|`Type::DEFAULT_EMPTY`|One of the `DEFAULT_*` constants, used by the administration interface for setting the default Field value. See below for more details.| +|`defaultType`|`mixed`|`Type::DEFAULT_EMPTY`|One of the `DEFAULT_*` constants, used by the administration interface for setting the default field value. See below for more details.| Following `defaultType` default value options are available as constants in the `Ibexa\Core\FieldType\Date\Type` class: @@ -99,11 +99,11 @@ $settings = [ ## Template rendering -The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date Field has access to the following parameters: +The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date field has access to the following parameters: | Parameter | Type |Description| |-----------|----------|------------| -| `locale` | `string` |Internal parameter set by the system based on current request locale or if not set, calculated based on the language of the Field. | +| `locale` | `string` |Internal parameter set by the system based on current request locale or if not set, calculated based on the language of the field. | Example: diff --git a/docs/content_management/field_types/field_type_reference/field_type_reference.md b/docs/content_management/field_types/field_type_reference/field_type_reference.md index 0b0bcda2a6..9c222a5e1a 100644 --- a/docs/content_management/field_types/field_type_reference/field_type_reference.md +++ b/docs/content_management/field_types/field_type_reference/field_type_reference.md @@ -5,7 +5,10 @@ page_type: reference # Field type reference -A field type is the underlying building block of the content model. It consists of two entities: Field value and Field definition. Field value is determined by values entered into the Content Field. Field definition is provided by the content type, and holds any user defined rules used by field type to determine how a Field Value is validated, stored, retrieved, formatted and so on. +A field type is the underlying building block of the content model. +It consists of two entities: field value and field definition. +Field value is determined by values entered into the content field. +Field definition is provided by the content type, and holds any user defined rules used by field type to determine how a field Value is validated, stored, retrieved, formatted and so on. [[= product_name =]] comes with a collection of field types that can be used to build powerful and complex content structures. In addition, it's possible to extend the system by creating custom types for special needs. @@ -23,7 +26,7 @@ Custom field types have to be programmed in PHP. However, the built-in field ty | [Author](authorfield.md) | Stores a list of authors, each consisting of author name and author email. | No | Yes | | [BinaryFile](binaryfilefield.md) | Stores a file.| Yes | Yes | | [Checkbox](checkboxfield.md) | Stores a boolean value. | Yes | Yes | -| [Content query](contentqueryfield.md) | Maps an executable repository query to a Field. | No | No | +| [Content query](contentqueryfield.md) | Maps an executable repository query to a field. | No | No | | [Country](countryfield.md) | Stores country names as a string. | Yes[^1^](#1-note-on-legacy-search-engine) | Yes | | [Customer group](customergroupfield.md) | Stores customer group to which a user belongs. | [DateAndTime](dateandtimefield.md) | Stores a full date including time information. | Yes | Yes | diff --git a/docs/content_management/field_types/field_type_reference/imagefield.md b/docs/content_management/field_types/field_type_reference/imagefield.md index f3b39bb947..a8f9ef003c 100644 --- a/docs/content_management/field_types/field_type_reference/imagefield.md +++ b/docs/content_management/field_types/field_type_reference/imagefield.md @@ -12,14 +12,14 @@ A **variation service** handles the conversion of the original image into diffe ### Value object -The `value` property of an Image Field returns an `Ibexa\Core\FieldType\Image\Value` object with the following properties: +The `value` property of an Image field returns an `Ibexa\Core\FieldType\Image\Value` object with the following properties: ##### Properties |Property|Type|Example|Description| |------|------|------|------| |`id`|string|`0/8/4/1/1480-1-eng-GB/image.png`|The image's unique identifier. Usually the path, or a part of the path. To get the full path, use the `uri` property.| -|`alternativeText`|string|`Picture of an apple.`|The alternative text, as entered in the Field's properties. This property is optional. It's recommended that you require the alternative text for an image when you add the Image Field to a content type, by selecting the "Alternative text is required" checkbox.| +|`alternativeText`|string|`Picture of an apple.`|The alternative text, as entered in the field's properties. This property is optional. It's recommended that you require the alternative text for an image when you add the Image field to a content type, by selecting the "Alternative text is required" checkbox.| |`fileName`|string|`image.png`|The original image's filename, without the path.| |`fileSize`|int|`37931`|The original image's size, in bytes.| |`uri`|string|`var/ezdemo_site/storage/images/0/8/4/1/1480-1-eng-GB/image.png`|The original image's URI.| @@ -73,19 +73,19 @@ The Image field type supports one `FieldDefinition` option: the maximum size for As the default value for maximum size is set to 10MB, we recommend setting the `upload_max_filesize` key in the `php.ini` configuration file to a value equal to or higher than that. It prevents validation errors while editing content types. -## Using an Image Field +## Using an Image field To read more about handling images and image variations, see the [Images documentation](images.md). ### Template Rendering -When displayed using `ibexa_render_field`, an Image Field outputs this type of HTML: +When displayed using `ibexa_render_field`, an Image field outputs this type of HTML: ``` html+twig Alternative text ``` -The template called by the [`ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Image Field accepts the following parameters: +The template called by the [`ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Image field accepts the following parameters: | Parameter | Type | Default | Description | |-----------|----------|----------------|-------------| @@ -100,7 +100,7 @@ Example:  {{ ibexa_render_field( content, 'image', { 'parameters':{ 'alias': 'imagelarge', 'width': 400, 'height': 400 } } ) }} ``` -The raw Field can also be used if needed. Image variations for the Field's content can be obtained using the `ibexa_image_alias` Twig helper: +The raw field can also be used if needed. Image variations for the field's content can be obtained using the `ibexa_image_alias` Twig helper: ``` html+twig {% set imageAlias = ibexa_image_alias( field, versionInfo, 'medium' ) %} @@ -114,7 +114,7 @@ The variation's properties can be used to generate the required output: ### With the REST API -Image Fields within REST are exposed by the `application/vnd.ibexa.api.Content` media-type. An Image Field looks like this: +Image Fields within REST are exposed by the `application/vnd.ibexa.api.Content` media-type. An Image field looks like this: ``` xml @@ -140,7 +140,7 @@ Image Fields within REST are exposed by the `application/vnd.ibexa.api.Content` ``` -Children of the `fieldValue` node list the general properties of the Field's original image (`fileSize`, `fileName`, `inputUri`, etc.), and its variations. For each variation, a URI is provided. Requested through REST, this resource generates the variation if it doesn't exist yet, and list the variation details: +Children of the `fieldValue` node list the general properties of the field's original image (`fileSize`, `fileName`, `inputUri`, etc.), and its variations. For each variation, a URI is provided. Requested through REST, this resource generates the variation if it doesn't exist yet, and list the variation details: ``` xml @@ -156,7 +156,7 @@ Children of the `fieldValue` node list the general properties of the Field's ori #### Getting an image variation -The variation service, `ibexa.field_type.ezimage.variation_service`, can be used to generate/get variations for a Field. It expects a VersionInfo, the Image Field, and the variation name as a string (`large`, `medium`, etc.): +The variation service, `ibexa.field_type.ezimage.variation_service`, can be used to generate/get variations for a field. It expects a VersionInfo, the Image field, and the variation name as a string (`large`, `medium`, etc.): ``` php $variation = $imageVariationHandler->getVariation( @@ -170,7 +170,7 @@ echo $variation->uri; ### From PHP -As for any field type, there are several ways to input content to a Field. For an Image, the quickest is to call `setField()` on the ContentStruct: +As for any field type, there are several ways to input content to a field. For an Image, the quickest is to call `setField()` on the ContentStruct: ``` php $createStruct = $contentService->newContentCreateStruct( @@ -211,9 +211,9 @@ $createStruct->setField( 'image', $imageValue ); ### From REST -The REST API expects Field values to be provided in a hash-like structure. Those keys are identical to those expected by the `Image\Value` constructor: `fileName`, `alternativeText`. In addition, image data can be provided using the `data` property, with the image's content encoded as base64. +The REST API expects field values to be provided in a hash-like structure. Those keys are identical to those expected by the `Image\Value` constructor: `fileName`, `alternativeText`. In addition, image data can be provided using the `data` property, with the image's content encoded as base64. -#### Creating an Image Field +#### Creating an Image field ``` @@ -236,9 +236,9 @@ The REST API expects Field values to be provided in a hash-like structure. Those ``` -### Updating an Image Field +### Updating an Image field -Updating an Image Field requires that you re-send existing data. This can be done by re-using the Field obtained via REST, **removing the variations key**, and updating `alternativeText`, `fileName` or `data`. If you do not want to change the image itself, do not provide the `data` key. +Updating an Image field requires that you re-send existing data. This can be done by re-using the field obtained via REST, **removing the variations key**, and updating `alternativeText`, `fileName` or `data`. If you do not want to change the image itself, do not provide the `data` key. ``` xml @@ -279,7 +279,7 @@ With the following values: Images are stored in `web/var/ezdemo_site/storage/images/0/8/4/1/1480-1-eng-GB`. -Using the Field ID digits in reverse order as the folder structure maximizes sharding of files through multiple folders on the filesystem. +Using the field ID digits in reverse order as the folder structure maximizes sharding of files through multiple folders on the filesystem. Within this folder, images are named like the uploaded file, suffixed with an underscore and the variation name: diff --git a/docs/content_management/field_types/field_type_reference/isbnfield.md b/docs/content_management/field_types/field_type_reference/isbnfield.md index 6a8673d9fc..85f3f32998 100644 --- a/docs/content_management/field_types/field_type_reference/isbnfield.md +++ b/docs/content_management/field_types/field_type_reference/isbnfield.md @@ -28,7 +28,7 @@ The constructor for this value object initializes a new Value object with the va ### Validation -The input passed into this field type is subject of ISBN validation depending on the Field settings in its FieldDefinition stored in the content type. An example of this Field setting is shown below and controls if input is validated as ISBN-13 or ISBN-10: +The input passed into this field type is subject of ISBN validation depending on the field settings in its FieldDefinition stored in the content type. An example of this field setting is shown below and controls if input is validated as ISBN-13 or ISBN-10: ``` php Array diff --git a/docs/content_management/field_types/field_type_reference/maplocationfield.md b/docs/content_management/field_types/field_type_reference/maplocationfield.md index fda73e5a7a..72345b9f4c 100644 --- a/docs/content_management/field_types/field_type_reference/maplocationfield.md +++ b/docs/content_management/field_types/field_type_reference/maplocationfield.md @@ -50,7 +50,7 @@ $MapLocationValue = new MapLocation\Value( ## Template rendering -The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Map Location Field accepts the following parameters: +The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Map Location field accepts the following parameters: |Parameter|Type|Default|Description| |------|------|------|------| diff --git a/docs/content_management/field_types/field_type_reference/matrixfield.md b/docs/content_management/field_types/field_type_reference/matrixfield.md index 6cb775b5a8..4f57166d65 100644 --- a/docs/content_management/field_types/field_type_reference/matrixfield.md +++ b/docs/content_management/field_types/field_type_reference/matrixfield.md @@ -1,6 +1,6 @@ # Matrix field type -This Field represents and handles a table of rows and columns of data. +This field represents and handles a table of rows and columns of data. | Name | Internal name | Expected input | |----------|---------------|----------------| @@ -37,11 +37,11 @@ new FieldType\Value([ ### Validation -The minimum number of rows is set on content type level for each Field. +The minimum number of rows is set on content type level for each field. Validation checks for empty rows. A row is considered empty if it contains only empty cells (or cells containing only spaces). Empty rows are removed. -If, after removing empty rows, the number of rows does not fulfill the configured `Minimum number of rows`, the Field doesn't validate. +If, after removing empty rows, the number of rows does not fulfill the configured `Minimum number of rows`, the field doesn't validate. For example, the following input doesn't validate if `Minimum number of rows` is set to 3, because the second row is empty: @@ -55,13 +55,13 @@ new FieldType\Value([ ## GraphQL field type operations -To get a Field of the Matrix field type with GraphQL, you need to specify a Content ID, a content type, and a field type. +To get a field of the Matrix field type with GraphQL, you need to specify a Content ID, a content type, and a field type. -The types that are returned are named after the Type and the Field: +The types that are returned are named after the Type and the field: - `{TypeIdentifier}{FieldIdentifier}Row` -The example below shows a GraphQL query for a Recipe content item (belonging to a content type with a Matrix Field added), that has two Fields: +The example below shows a GraphQL query for a Recipe content item (belonging to a content type with a Matrix field added), that has two fields: - `name`: `ezstring` - `ingredients`: `ezmatrix` with two columns: `ingredient` and `quantity` @@ -80,7 +80,7 @@ The example below shows a GraphQL query for a Recipe content item (belonging to } ``` -The Type returned for the Matrix Field exposes columns defined in the Field definition: +The Type returned for the Matrix field exposes columns defined in the field definition: ``` { @@ -104,9 +104,9 @@ The Type returned for the Matrix Field exposes columns defined in the Field defi } ``` -### Query for the field type and Field definition's details +### Query for the field type and field definition's details -With this query you can inspect details of specific content type. In case of a Matrix Field, you can ask for the list of columns, their names and identifiers. +With this query you can inspect details of specific content type. In case of a Matrix field, you can ask for the list of columns, their names and identifiers. ``` { @@ -167,12 +167,12 @@ Example response: ### Mutation -To create a Matrix field type you need to define field type and Field definition identifiers. -The types that are used for input are named after the Type and the Field: +To create a Matrix field type you need to define field type and field definition identifiers. +The types that are used for input are named after the Type and the field: - `{TypeIdentifier}{FieldIdentifier}RowInput` e.g. `dish.nutritionFacts`, `event.agenda`: `DishNutritionFactsRowInput`, `EventAgendaRowInput` -The example below shows how to create a Recipe content item (belonging to a content type with a Matrix field type added) that has two Fields: +The example below shows how to create a Recipe content item (belonging to a content type with a Matrix field type added) that has two fields: - `name`: `"Cake Ingredient List"` - `ingredients`: `ezmatrix` with two columns: `ingredient` and `quantity` @@ -195,7 +195,7 @@ The example below shows how to create a Recipe content item (belonging to a cont } ``` -The response confirms creation of the new Recipe Field: +The response confirms creation of the new Recipe field: ``` { diff --git a/docs/content_management/field_types/field_type_reference/relationfield.md b/docs/content_management/field_types/field_type_reference/relationfield.md index 3eecb4a313..41bdcab5a9 100644 --- a/docs/content_management/field_types/field_type_reference/relationfield.md +++ b/docs/content_management/field_types/field_type_reference/relationfield.md @@ -48,7 +48,7 @@ This field type validates whether the provided relation exists, but before that ### Settings -The Field definition of this field type can be configured with three options: +The field definition of this field type can be configured with three options: |Name|Type|Default value|Description| |------|------|------|------| diff --git a/docs/content_management/field_types/field_type_reference/relationlistfield.md b/docs/content_management/field_types/field_type_reference/relationlistfield.md index 081abdf4d8..6bf2fe0943 100644 --- a/docs/content_management/field_types/field_type_reference/relationlistfield.md +++ b/docs/content_management/field_types/field_type_reference/relationlistfield.md @@ -60,7 +60,7 @@ This field type validates if: - the `selectionMethod` specified is `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_BROWSE` or `\Ibexa\Core\FieldType\RelationList\Type::SELECTION_DROPDOWN`. A validation error is thrown if the value does not match. - the `selectionDefaultLocation` specified is `null`, `string` or `integer`. If the type validation fails a validation error is thrown. - the value specified in `selectionContentTypes` is an `array`. If not, a validation error in given. -- the number of content items selected in the Field isn't greater than the `selectionLimit`. +- the number of content items selected in the field isn't greater than the `selectionLimit`. !!! note @@ -68,7 +68,7 @@ This field type validates if: ### Settings -The Field definition of this field type can be configured with the following options: +The field definition of this field type can be configured with the following options: |Name|Type|Default value|Description| |------|------|------|------| @@ -87,7 +87,7 @@ Following selection methods are available: |Name|Type|Default value|Description| |------|------|------|------| -|`RelationListValueValidator[selectionLimit]`|`integer`|`0`|The number of content items that can be selected in the Field. When set to 0, any number can be selected.| +|`RelationListValueValidator[selectionLimit]`|`integer`|`0`|The number of content items that can be selected in the field. When set to 0, any number can be selected.| ``` php // Example of using settings and validators configuration in PHP diff --git a/docs/content_management/field_types/field_type_reference/selectionfield.md b/docs/content_management/field_types/field_type_reference/selectionfield.md index 88852b4749..be0133db59 100644 --- a/docs/content_management/field_types/field_type_reference/selectionfield.md +++ b/docs/content_management/field_types/field_type_reference/selectionfield.md @@ -63,7 +63,7 @@ $hash = [ 1, 2 ]; ### Validation -This field type validates the input, verifying if all selected options exist in the Field definition and checks if multiple selections are allowed in the Field definition. +This field type validates the input, verifying if all selected options exist in the field definition and checks if multiple selections are allowed in the field definition. If any of these validations fail, a `ValidationError` is thrown, specifying the error message. When option validation fails, a list with the invalid options is also presented. ### Settings @@ -71,7 +71,7 @@ If any of these validations fail, a `ValidationError` is thrown, specifying the | Name | Type | Default value | Description| |--------------|-----------|---------------|------------| | `isMultiple` | `boolean` | `false` | Used to allow or prohibit multiple selection from the option list. | -| `options` | `hash` | `[]` | Stores the list of options defined in the Field definition. | +| `options` | `hash` | `[]` | Stores the list of options defined in the field definition. | ``` php // Selection field type example settings diff --git a/docs/content_management/field_types/field_type_reference/sesexternaldata.md b/docs/content_management/field_types/field_type_reference/sesexternaldata.md index 78af38f8f9..c8d2f9c22d 100644 --- a/docs/content_management/field_types/field_type_reference/sesexternaldata.md +++ b/docs/content_management/field_types/field_type_reference/sesexternaldata.md @@ -6,7 +6,7 @@ The data is stored in the `ses_externaldata` table with the following structure: |Field|Type|Description| |--- |--- |--- | |`sku`|char(40)|Unique ID of the Product category (CatalogElement).| -|`identifier`|char(40)|ID of the Field.| +|`identifier`|char(40)|ID of the field.| |`language_code`|char(8)|Language code, for example, `ger-DE`.| |`ses_field_type`|char(20)|The data type used for this data.| |`content`|longtext|Serialized data in string format.| diff --git a/docs/content_management/field_types/field_type_reference/sesprofiledata.md b/docs/content_management/field_types/field_type_reference/sesprofiledata.md index fd6fe85102..c836bbd15b 100644 --- a/docs/content_management/field_types/field_type_reference/sesprofiledata.md +++ b/docs/content_management/field_types/field_type_reference/sesprofiledata.md @@ -8,4 +8,4 @@ because it's impossible to store special HTML characters (`<`,`>`, `""`,`''`, `& The name of the customer (taken from the contact section) can be used for lists. To do it, use the name pattern in the content type definition of the User content type. -`customer_profile_data` is the identifier of the Field where the profile data is stored. +`customer_profile_data` is the identifier of the field where the profile data is stored. diff --git a/docs/content_management/field_types/field_type_reference/sesselection.md b/docs/content_management/field_types/field_type_reference/sesselection.md index 857c262f56..56a21e8fd5 100644 --- a/docs/content_management/field_types/field_type_reference/sesselection.md +++ b/docs/content_management/field_types/field_type_reference/sesselection.md @@ -20,4 +20,4 @@ ibexa.commerce.site_access.config.core.default.sesselection.news_type: The `translation_context` key, which identifies the context used for translating the labels, is optional. -To add a SesSelection Field to a content type, make sure the Field's identifier is the same as the configuration key (in the example above, `news_type`). +To add a SesSelection field to a content type, make sure the field's identifier is the same as the configuration key (in the example above, `news_type`). diff --git a/docs/content_management/field_types/field_type_reference/specificationstype.md b/docs/content_management/field_types/field_type_reference/specificationstype.md index 27358f9436..205526c3b6 100644 --- a/docs/content_management/field_types/field_type_reference/specificationstype.md +++ b/docs/content_management/field_types/field_type_reference/specificationstype.md @@ -4,7 +4,7 @@ This field type stores a structured list of attributes for products. !!! caution "Field naming" - A Field of the SpecificationsType must have `ses_specifications` as its Field identifier. + A field of the SpecificationsType must have `ses_specifications` as its field identifier. The data is stored in JSON format. diff --git a/docs/content_management/field_types/field_type_reference/taxonomyentryassignmentfield.md b/docs/content_management/field_types/field_type_reference/taxonomyentryassignmentfield.md index 900e915f72..4e2234d08f 100644 --- a/docs/content_management/field_types/field_type_reference/taxonomyentryassignmentfield.md +++ b/docs/content_management/field_types/field_type_reference/taxonomyentryassignmentfield.md @@ -1,15 +1,15 @@ # TaxonomyEntryAssignment field type -`TaxonomyEntryAssignment` Field is used to integrate content with the Taxonomy module. +`TaxonomyEntryAssignment` field is used to integrate content with the Taxonomy module. It allows you to select tags or categories and assign them to content. This field type assigns tags to the content in the data action, so then you can use `TaxonomyService` on this content item. !!! caution "Duplicate taxonomy fields" - Because tags are assigned per content item, not per Field, you cannot use two **Taxonomy Entry Assignment** Fields with the same taxonomy type in one content type. + Because tags are assigned per content item, not per field, you cannot use two **Taxonomy Entry Assignment** fields with the same taxonomy type in one content type. -To be able to assign tags to the content, first, you need to add a `TaxonomyEntryAssignment` Field to the content type definition. +To be able to assign tags to the content, first, you need to add a `TaxonomyEntryAssignment` field to the content type definition. | Name | Internal name | Expected input | |--------------------------|----------------------------------|----------------| @@ -60,8 +60,8 @@ The constructor accepts `taxonomyEntries` and `taxonomy` as described above. #### String representation -If the Field has no entries - empty string. -If the Field has entries (for example: "Cars and 5 more") - a string displaying the first taxonomy entry and the number of rest of the entries. +If the field has no entries - empty string. +If the field has entries (for example: "Cars and 5 more") - a string displaying the first taxonomy entry and the number of rest of the entries. #### Hash format diff --git a/docs/content_management/field_types/field_type_reference/taxonomyentryfield.md b/docs/content_management/field_types/field_type_reference/taxonomyentryfield.md index 28937db563..f28def6546 100644 --- a/docs/content_management/field_types/field_type_reference/taxonomyentryfield.md +++ b/docs/content_management/field_types/field_type_reference/taxonomyentryfield.md @@ -11,7 +11,7 @@ It's used as a parent for a tag or category. ### Input expectations -A `TaxonomyEntry` Field accepts an array with an `Ibexa\Contracts\Taxonomy\Value\TaxonomyEntry` object. +A `TaxonomyEntry` field accepts an array with an `Ibexa\Contracts\Taxonomy\Value\TaxonomyEntry` object. | Type | Description | Example | |--------|-----------------|-----------------| @@ -69,7 +69,7 @@ No validation. #### Settings -The Field definition of this field type can be configured with the following options: +The field definition of this field type can be configured with the following options: |Name|Type|Default value|Description| |------|------|------|------| diff --git a/docs/content_management/field_types/field_type_reference/timefield.md b/docs/content_management/field_types/field_type_reference/timefield.md index 4cf65dbde3..3ee3a86c38 100644 --- a/docs/content_management/field_types/field_type_reference/timefield.md +++ b/docs/content_management/field_types/field_type_reference/timefield.md @@ -80,11 +80,11 @@ $settings = [ ## Template rendering -The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date Field has access to the following parameters: +The template called by [the `ibexa_render_field()` Twig function](field_twig_functions.md#ibexa_render_field) while rendering a Date field has access to the following parameters: | Parameter | Type | Default | Description| |-----------|----------|---------|------------| -| `locale` | `string` |   n/a | Internal parameter set by the system based on current request locale or, if not set, calculated based on the language of the Field. | +| `locale` | `string` |   n/a | Internal parameter set by the system based on current request locale or, if not set, calculated based on the language of the field. | Example: diff --git a/docs/content_management/field_types/field_type_search.md b/docs/content_management/field_types/field_type_search.md index 6dc4f804b1..ac6ba501e3 100644 --- a/docs/content_management/field_types/field_type_search.md +++ b/docs/content_management/field_types/field_type_search.md @@ -30,11 +30,11 @@ This example from the `Url` field type shows that the field type always returns ### `getDefaultMatchField()` -This method retrieves the name of the default Field to be used for matching. As field types can index multiple Fields (see [MapLocation](maplocationfield.md) field type's implementation of this interface), this method is used to define the default field for matching. The default Field is typically used by the [`Field` Search Criterion](field_criterion.md). +This method retrieves the name of the default field to be used for matching. As field types can index multiple fields (see [MapLocation](maplocationfield.md) field type's implementation of this interface), this method is used to define the default field for matching. The default field is typically used by the [`Field` Search Criterion](field_criterion.md). ### `getDefaultSortField()` -This method gets name of the default Field to be used for sorting. As field types can index multiple Fields (see [MapLocation](maplocationfield.md) field type's implementation of this interface), this method is used to define default field for sorting. Default Field is typically used by the [`Field` Sort Clause](field_sort_clause.md). +This method gets name of the default field to be used for sorting. As field types can index multiple fields (see [MapLocation](maplocationfield.md) field type's implementation of this interface), this method is used to define default field for sorting. Default field is typically used by the [`Field` Sort Clause](field_sort_clause.md). ## Register `Indexable` implementations @@ -49,15 +49,15 @@ Ibexa\Core\FieldType\Keyword\SearchField: `alias` should be the same as field type ID. -## Search Field values +## Search field values -The search Field values returned by the `getIndexData` method are simple value objects consisting of the following properties: +The search field values returned by the `getIndexData` method are simple value objects consisting of the following properties: |Property|Description| |--------|-----------| |`$name`|The name of the field| |`$value`|The value of the field| -|`$type`|An `Ibexa\Contracts\Core\Search\FieldType` instance, describing the type information of the Field.| +|`$type`|An `Ibexa\Contracts\Core\Search\FieldType` instance, describing the type information of the field.| ## Search field types @@ -68,13 +68,13 @@ The default available search field types that can be found in the `Ibexa\Contrac |Field type|Description| |--------|-----------| |`BooleanField`|Boolean values.| -|`CustomField`|Custom Field, for custom search data types. Probably requires additional configuration in the search backend.| +|`CustomField`|Custom field, for custom search data types. Probably requires additional configuration in the search backend.| |`DateField`|Date field. Can be used for date range queries.| |`DocumentField`|Document field| |`FloatField`|Field for floating point numbers.| -|`FullTextField`|Represents full text searchable value of the Field which can be indexed by the legacy search engine. Some full text Fields are stored as an array of strings.| +|`FullTextField`|Represents full text searchable value of the field which can be indexed by the legacy search engine. Some full text fields are stored as an array of strings.| |`GeoLocationField`|Field used for Geo Location.| -|`IdentifierField`|Field used for IDs. Basically acts like the string Field, but it's not queried by fulltext searches| +|`IdentifierField`|Field used for IDs. Basically acts like the string field, but it's not queried by fulltext searches| |`IntegerField`|Field for integer numbers.| |`MultipleBooleanField`|Multiple boolean values.| |`MultipleIdentifierField`|Multiple IDs values.| @@ -87,12 +87,12 @@ The default available search field types that can be found in the `Ibexa\Contrac ## Configuring Solr As mentioned before, if you use the standard type definitions, there is no need to configure the search backend in any way. -The Field definitions are handled using `dynamicField` definitions in Solr, for example. +The field definitions are handled using `dynamicField` definitions in Solr, for example. -If you want to configure the handling of your Field, you can always add a special Field definition to the Solr `schema.xml`. For Fields, the field type names used by the Solr search backend look like this: `//_`. +If you want to configure the handling of your field, you can always add a special field definition to the Solr `schema.xml`. For fields, the field type names used by the Solr search backend look like this: `//_`. You can define custom `dynamicField` definitions to match, for example, on your custom `_` definition. -You could also define a custom Field definition for certain Fields, like for the name Field in an article: +You could also define a custom field definition for certain fields, like for the name field in an article: ``` diff --git a/docs/content_management/field_types/field_type_storage.md b/docs/content_management/field_types/field_type_storage.md index 507352bfe4..73da67dac2 100644 --- a/docs/content_management/field_types/field_type_storage.md +++ b/docs/content_management/field_types/field_type_storage.md @@ -6,17 +6,17 @@ description: To be able to store the data saved to a Field, you must configure s ## Storage conversion -If you want to store Field values in regular [[= product_name =]] database tables, +If you want to store field values in regular [[= product_name =]] database tables, the `FieldValue` must be converted to the storage-specific format used by the Persistence SPI: `Ibexa\Contracts\Core\Persistence\Content\FieldValue`. -After restoring a Field of the field type, you must reverse the conversion. +After restoring a field of the field type, you must reverse the conversion. The following methods of the field type are responsible for that: |Method|Description| |------|-----------| -|`toPersistenceValue()`|This method receives the value of a Field of the field type and returns an SPI `FieldValue`, which can be stored.| -|`fromPersistenceValue()`|This method receives an SPI `FieldValue` and reconstructs the original value of the Field from it.| +|`toPersistenceValue()`|This method receives the value of a field of the field type and returns an SPI `FieldValue`, which can be stored.| +|`fromPersistenceValue()`|This method receives an SPI `FieldValue` and reconstructs the original value of the field from it.| The SPI `FieldValue` struct has properties which the field type can use: @@ -24,15 +24,15 @@ The SPI `FieldValue` struct has properties which the field type can use: |--------|-----------| |`$data`|The data to be stored in the database. This may be a scalar value, an associative array or a simple, serializable object.| |`$externalData`|The arbitrary data stored in this field isn't touched by any of the [[= product_name =]] components directly, but is available for [Storing data externally](#storing-data-externally).| -|`$sortKey`|A value which can be used to sort content by this Field.| +|`$sortKey`|A value which can be used to sort content by this field.| ### Legacy storage engine -The Legacy storage engine uses the `ezcontentobject_attribute` table to store Field values, -and `ezcontentclass_attribute` to store Field definition values. +The Legacy storage engine uses the `ezcontentobject_attribute` table to store field values, +and `ezcontentclass_attribute` to store field definition values. they're both based on the same principle. -Each row represents a Field or a Field definition, and offers several free fields of different types, where the type can store its data e.g. +Each row represents a field or a field definition, and offers several free fields of different types, where the type can store its data e.g. - `ezcontentobject_attribute` offers: - `data_int` @@ -47,7 +47,7 @@ Each type is free to use those fields in any way it requires. The default Legacy storage engine cannot store arbitrary value information as provided by a field type. This means that using this storage engine requires a conversion. -Converters map a Field's semantic values to the fields described above, for both settings (validation and configuration) and value. +Converters map a field's semantic values to the fields described above, for both settings (validation and configuration) and value. The conversion takes place through the `Ibexa\Core\Persistence\Legacy\Content\FieldValue\Converter` interface, which you must implement in your field type. The interface contains the following methods: @@ -79,7 +79,7 @@ The tag has the following attribute: | Attribute name | Usage | |----------------|-------| -| `alias` | Represents the `fieldTypeIdentifier` (just like for the [field type service](type_and_value.md#registration)). | +| `alias` | Represents the `fieldTypeIdentifier` (like for the [field type service](type_and_value.md#registration)). | !!! tip @@ -94,15 +94,15 @@ or even the [[= product_name =]] database itself (in form of a non-standard tabl To store data in external storage, the field type interacts with the Persistence SPI through the `Ibexa\Contracts\Core\FieldType\FieldStorage` interface. -Accessing the internal storage of a content item that includes a Field of the field type +Accessing the internal storage of a content item that includes a field of the field type calls one of the following methods to also access the external data: |Method|Description| |------|-----------| |`hasFieldData()`|Returns whether the field type stores external data at all.| -|`storeFieldData()`|Called right before a Field of the field type is stored. The method stores `$externalData`. It returns `true` if the call manipulated internal data of the given Field, so that it's updated in the internal database.| -|`getFieldData()`|Called after a Field has been restored from the database to restore `$externalData`.| -|`deleteFieldData()`|Must delete external data for the given Field, if exists.| +|`storeFieldData()`|Called right before a Field of the field type is stored. The method stores `$externalData`. It returns `true` if the call manipulated internal data of the given field, so that it's updated in the internal database.| +|`getFieldData()`|Called after a field has been restored from the database to restore `$externalData`.| +|`deleteFieldData()`|Must delete external data for the given field, if exists.| |`getIndexData()`|Returns the actual index data for the provided `Ibexa\Contracts\Core\Persistence\Content\Field`. For more information, see [search service](field_type_search.md#search-field-values).| Each of the above methods (except `hasFieldData`) receives a `$context` array with information on the underlying storage and the environment. diff --git a/docs/content_management/field_types/field_type_validation.md b/docs/content_management/field_types/field_type_validation.md index 9496254370..8faab59a9c 100644 --- a/docs/content_management/field_types/field_type_validation.md +++ b/docs/content_management/field_types/field_type_validation.md @@ -1,5 +1,5 @@ --- -description: Field type validation allows you to validate if data entered stored in the Field conforms to the schema. +description: Field type validation allows you to validate if data entered stored in the field conforms to the schema. --- # Field type validation diff --git a/docs/content_management/field_types/field_types.md b/docs/content_management/field_types/field_types.md index e8bd92c6cf..9979d30106 100644 --- a/docs/content_management/field_types/field_types.md +++ b/docs/content_management/field_types/field_types.md @@ -1,5 +1,5 @@ --- -description: Field types define the Fields that a content item is built of. +description: Field types define the fields that a content item is built of. --- # Field types @@ -12,11 +12,11 @@ Field types are responsible for: - Storing data, either using the native storage engine mechanisms or specific means - Validating input data - Making the data searchable (if applicable) -- Displaying Fields of this type +- Displaying fields of this type ## Custom data -[[= product_name =]] can support custom data to be stored in the Fields of a content item. +[[= product_name =]] can support custom data to be stored in the fields of a content item. To do so, you need to create a custom field type. A custom field type must implement the **FieldType Service Provider Interfaces** diff --git a/docs/content_management/field_types/form_and_template.md b/docs/content_management/field_types/form_and_template.md index b064f1eb94..9ce61fc79b 100644 --- a/docs/content_management/field_types/form_and_template.md +++ b/docs/content_management/field_types/form_and_template.md @@ -1,12 +1,12 @@ --- -description: field type FormMappers allow Field editing, while custom templates ensure the Field can be rendered both in the back office and on site front. +description: Field type FormMappers allow field editing, while custom templates ensure the field can be rendered both in the back office and on site front. --- # Form and template ## FormMapper -The FormMapper maps Field definitions into Symfony forms, allowing Field editing. +The FormMapper maps field definitions into Symfony forms, allowing field editing. It can implement two interfaces: @@ -18,7 +18,7 @@ when you require non-standard settings The `FieldValueFormMapperInterface::mapFieldValueForm` method accepts two arguments: -- `FormInterface` — form for the current Field +- `FormInterface` — form for the current field - `FieldData` — underlying data for current field form You have to add your form type to the content editing form. The example shows how `ezboolean` injects the form: @@ -55,9 +55,9 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) Your type has to be called `value`. In the example above, `CheckboxFieldType::class` is used, but you can use standard Symfony form type instead. -It's good practice to encapsulate Fields with custom types as it allows easier templating. +It's good practice to encapsulate fields with custom types as it allows easier templating. Type has to be compatible with your field type's `Ibexa\Core\FieldType` implementation. -You can use a [`DataTransformer`]([[= symfony_doc =]]/form/data_transformers.html) to achieve that or just assure correct property and form field names. +You can use a [`DataTransformer`]([[= symfony_doc =]]/form/data_transformers.html) to achieve that or assure correct property and form field names. ### FieldDefinitionFormMapperInterface @@ -120,8 +120,8 @@ The `fieldType` key has to correspond to the name of your field type. ## Content view templates -To render the Field in content view by using the [`ibexa_render_field()` Twig helper](field_twig_functions.md#ibexa_render_field), -you need to define a template containing a block for the Field. +To render the field in content view by using the [`ibexa_render_field()` Twig helper](field_twig_functions.md#ibexa_render_field), +you need to define a template containing a block for the field. ``` html+twig {% block customfieldtype_field %} @@ -184,7 +184,7 @@ ibexa: ### Back office view template -For templates for previewing the Field in the back office, +For templates for previewing the field in the back office, using the design engine is recommended with `ibexa_standard_design.override_kernel_templates` set to `true`. With the design engine you can apply a template (e.g. `Resources/views/themes/admin/content_fields.html.twig`) without any extra configuration. @@ -200,7 +200,7 @@ ibexa: ### Field edit template -To use a template for the Field edit form in the back office, you need to specify it in configuration +To use a template for the field edit form in the back office, you need to specify it in configuration under the `twig.form_themes` [configuration key](configuration.md#configuration-files): ``` yaml diff --git a/docs/content_management/field_types/type_and_value.md b/docs/content_management/field_types/type_and_value.md index cd2f40ee22..cd00b660e4 100644 --- a/docs/content_management/field_types/type_and_value.md +++ b/docs/content_management/field_types/type_and_value.md @@ -66,7 +66,7 @@ A field type needs to deal with the custom value format provided by it. In order #### `acceptValue()` -This method is responsible for accepting and converting user input for the Field. It checks the input structure by accepting, building, and returning a different structure holding the data. +This method is responsible for accepting and converting user input for the field. It checks the input structure by accepting, building, and returning a different structure holding the data. For example: a user provides an HTTP link as a string, `acceptValue()` converts the link to a URL field type value object. Unlike the `FieldType\Value` constructor, it's possible to make this method aware of multiple input types (object or primitive). diff --git a/docs/content_management/forms/create_form_attribute.md b/docs/content_management/forms/create_form_attribute.md index 4cb7ccbdca..eecc92d055 100644 --- a/docs/content_management/forms/create_form_attribute.md +++ b/docs/content_management/forms/create_form_attribute.md @@ -83,9 +83,9 @@ php bin/console assets:install yarn encore dev ``` -## Implement Field +## Implement field -Now you have to implement the Field, and make sure the value from the Rich Text attribute is passed on to the field form. +Now you have to implement the field, and make sure the value from the Rich Text attribute is passed on to the field form. Create a `src/FormBuilder/Form/Type/CheckboxWithRichtextDescriptionType.php` file. @@ -105,7 +105,7 @@ Now, the attribute value can be stored in the new Form. ## Create submission converter -The new Field is based on a checkbox, so to display the submissions of this field, you can use the `BooleanFieldSubmissionConverter`. +The new field is based on a checkbox, so to display the submissions of this field, you can use the `BooleanFieldSubmissionConverter`. Create a `src/FormBuilder/FormSubmission/Converter/RichtextDescriptionFieldSubmissionConverter.php` file. diff --git a/docs/content_management/forms/form_api.md b/docs/content_management/forms/form_api.md index c5c0c5e3c7..3c2f2428e8 100644 --- a/docs/content_management/forms/form_api.md +++ b/docs/content_management/forms/form_api.md @@ -33,7 +33,7 @@ This method takes: - the `ContentInfo` object of the content item containing the form - the language code -- the value of the Field containing the form +- the value of the field containing the form - the array of form field values ``` php diff --git a/docs/content_management/forms/form_builder_guide.md b/docs/content_management/forms/form_builder_guide.md index 411e4b5b15..aad4fe1e29 100644 --- a/docs/content_management/forms/form_builder_guide.md +++ b/docs/content_management/forms/form_builder_guide.md @@ -102,7 +102,7 @@ To do it, you have to: 1. add Symfony form type, 1. customize Form templates, 1. add scripts, -1. implement Field, +1. implement field, 1. implement field mapper, 1. create submission converter. diff --git a/docs/content_management/images/add_image_asset_from_dam.md b/docs/content_management/images/add_image_asset_from_dam.md index 0026685098..11b6b748e5 100644 --- a/docs/content_management/images/add_image_asset_from_dam.md +++ b/docs/content_management/images/add_image_asset_from_dam.md @@ -76,7 +76,7 @@ You can customize the parameters according to your needs. For more information about supported parameters, see the [Unsplash documentation](https://unsplash.com/documentation#dynamically-resizable-images). In the back office, go to **Admin** > **Content types**. -In the **Content** group, create a content type for DAM images, which includes the ImageAsset Field. +In the **Content** group, create a content type for DAM images, which includes the ImageAsset field. Now, when you use the Embed block in the Page Builder, you should see a DAM Image. diff --git a/docs/content_management/images/configure_image_editor.md b/docs/content_management/images/configure_image_editor.md index 10d904e115..3e6688f525 100644 --- a/docs/content_management/images/configure_image_editor.md +++ b/docs/content_management/images/configure_image_editor.md @@ -4,7 +4,7 @@ description: Configure image editor to crop, flip, and modify images. # Configure Image Editor -When a content item contains Fields of the [ezimage](imageassetfield.md) type, users can perform basic image editing functions with the Image Editor. +When a content item contains fields of the [ezimage](imageassetfield.md) type, users can perform basic image editing functions with the Image Editor. For more information, see the [user documentation]([[= user_doc =]]/editing_images/). !!! note diff --git a/docs/content_management/pages/page_builder_guide.md b/docs/content_management/pages/page_builder_guide.md index 8f561289fd..55de800b46 100644 --- a/docs/content_management/pages/page_builder_guide.md +++ b/docs/content_management/pages/page_builder_guide.md @@ -67,10 +67,10 @@ E. Buttons: |Button|Description| |------|-----------| -|![Edit and preview switch](page_builder_toolbar_editpreview.png)|Access main properties of the Page, like title and description.| -|![Preview segments](page_builder_toolbar_preview_segment.png)|Access preview of the Page for a given Segment.| -|![Timeline button](page_builder_toolbartimelinetoggler.png)|Access the timeline to preview how the Page changes with time. You can also view the list of all upcoming scheduled events.| -|![View toggler](page_builder_toolbar_devicestoggler.png)|Toggle through to see how the Page is rendered on different devices.| +|![Edit and preview switch](page_builder_toolbar_editpreview.png)|Access main properties of the page, like title and description.| +|![Preview segments](page_builder_toolbar_preview_segment.png)|Access preview of the page for a given segment.| +|![Timeline button](page_builder_toolbartimelinetoggler.png)|Access the timeline to preview how the page changes with time. You can also view the list of all upcoming scheduled events.| +|![View toggler](page_builder_toolbar_devicestoggler.png)|Toggle through to see how the page is rendered on different devices.| |![Elements menu](page_builder_toolbarelements.png)|Move Page blocks / Structure view to the other side of the screen.| |![Undo](page_builder_undo.png)|Undo latest change.| |![Redo](page_builder_redo.png)|Redo latest change.| @@ -201,9 +201,9 @@ Additionaly, Page Builder offers you a selection of ready-to-use page blocks tha A. **Default** blocks: -- Dynamic targeting - embeds recommended items based on the Segment the user belongs to. +- Dynamic targeting - embeds recommended items based on the segment the user belongs to. - Personalized - displays a list of content items/products that are recommended to end users when specific scenarios are triggered. -- Targeting - embeds a content item based on the Segment the user belongs to. +- Targeting - embeds a content item based on the segment the user belongs to. B. **PIM** blocks: diff --git a/docs/content_management/rich_text/extend_online_editor.md b/docs/content_management/rich_text/extend_online_editor.md index f6b346e3d6..8b285ef127 100644 --- a/docs/content_management/rich_text/extend_online_editor.md +++ b/docs/content_management/rich_text/extend_online_editor.md @@ -4,7 +4,7 @@ description: Add custom tags, styles and data attributes to enrich the functiona # Extend Online Editor -[[= product_name =]] users edit the contents of RichText Fields, for example, +[[= product_name =]] users edit the contents of RichText fields, for example, in the Content box of a Page, by using the Online Editor. You can extend the Online Editor by adding custom tags and styles, defining custom diff --git a/docs/content_management/rich_text/online_editor_guide.md b/docs/content_management/rich_text/online_editor_guide.md index b4f4d76f4e..6687e9e979 100644 --- a/docs/content_management/rich_text/online_editor_guide.md +++ b/docs/content_management/rich_text/online_editor_guide.md @@ -6,7 +6,7 @@ description: Learn how to use the Online Editor, a tool that allows you to edit ## What is Online Editor -Online Editor is the interface for editing RichText Fields in any content item in [[= product_name =]]. +Online Editor is the interface for editing RichText fields in any content item in [[= product_name =]]. It offers standard editing capabilities and extensibility points to customize the editing experience and the available elements. Online Editor is based on [CKEditor 5](https://ckeditor.com/ckeditor-5/). @@ -17,9 +17,9 @@ Online Editor is available in all supported [[= product_name =]] versions and ed ## How to get started -Online Editor is the default editing interface for all RichText Fields. -To start using it, create any content item with a RichText Field -(for example, using the built-in Article content type) and edit this Field. +Online Editor is the default editing interface for all RichText fields. +To start using it, create any content item with a RichText field +(for example, using the built-in Article content type) and edit this field. ## Capabilities @@ -30,12 +30,12 @@ It also allows embedding other content from the repository, but also from Facebo #### Links -All links added to a RichText Field by using the link element are listed +All links added to a RichText field by using the link element are listed and can be managed in the [Link manager](url_management.md). #### Distraction free mode -While editing Rich Text Fields, you can switch to distraction free mode that expands the workspace to full screen. +While editing Rich Text fields, you can switch to distraction free mode that expands the workspace to full screen. ![Distraction free mode](distraction_free_mode.png) @@ -116,6 +116,6 @@ Refer to [Extend Online Editor](extend_online_editor.md#link-tag) for a similar ### Embed external resources -Custom tags allow embedding content from external resources inside RichText Fields. +Custom tags allow embedding content from external resources inside RichText fields. The built-in elements offer embedding of Twitter or Facebook posts, but you can extend the capability by embedding other resources. These can be, for example, 3D product or real estate viewers. \ No newline at end of file diff --git a/docs/content_management/url_management/url_api.md b/docs/content_management/url_management/url_api.md index cd85a1b6e3..e12facc24c 100644 --- a/docs/content_management/url_management/url_api.md +++ b/docs/content_management/url_management/url_api.md @@ -1,11 +1,11 @@ --- -description: The PHP API URLService enables searching for external URLs used in tech text and URL Fields. +description: The PHP API URLService enables searching for external URLs used in tech text and URL fields. --- # URL API [`URLService`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-URLService.html) -enables you to find, load and update external URLs used in RichText and URL Fields. +enables you to find, load and update external URLs used in RichText and URL fields. To view a list of all URLs, use [`URLService::findUrls`](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-URLService.html#method_findUrls) diff --git a/docs/permissions/limitation_reference.md b/docs/permissions/limitation_reference.md index bb5d987c13..3e690e3521 100644 --- a/docs/permissions/limitation_reference.md +++ b/docs/permissions/limitation_reference.md @@ -279,10 +279,10 @@ This limitation can be used as a role limitation. |------|------|------| |``|``|All valid session IDs can be set as value(s)| -## Segment Group limitation [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] +## Segment group limitation [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] -The Segment Group (`SegmentGroup`) limitation specifies whether the User has access Segments within a specific -Segment Group. +The segment group (`SegmentGroup`) limitation specifies whether the user has access segments within a specific +segment group. This limitation can be used as a role limitation. @@ -290,7 +290,7 @@ This limitation can be used as a role limitation. |Value|UI value|Description| |------|------|------| -|``|``|All valid Segment Group IDs can be set as value(s).| +|``|``|All valid segment group IDs can be set as value(s).| ## SiteAccess limitation diff --git a/docs/permissions/policies.md b/docs/permissions/policies.md index 64e6f25e54..40602e556b 100644 --- a/docs/permissions/policies.md +++ b/docs/permissions/policies.md @@ -146,20 +146,20 @@ which define, which parts of the application or website the user has access to. | Module | Function | Effect | Possible limitations | |------------------------|-------------------------------|--------------------------|-------------------------------------------------------------------| -| `segment` | `assign_to_user` | assign Segments to Users | [Segment Group](limitation_reference.md#segment-group-limitation) | -| | `create` | create Segments | [Segment Group](limitation_reference.md#segment-group-limitation) | -| | `read` | load Segment information | [Segment Group](limitation_reference.md#segment-group-limitation) | -| | `remove` | remove Segments | [Segment Group](limitation_reference.md#segment-group-limitation) | -| | `update` | update Segments | [Segment Group](limitation_reference.md#segment-group-limitation) | +| `segment` | `assign_to_user` | assign segments to users | [Segment Group](limitation_reference.md#segment-group-limitation) | +| | `create` | create segments | [Segment Group](limitation_reference.md#segment-group-limitation) | +| | `read` | load segment information | [Segment Group](limitation_reference.md#segment-group-limitation) | +| | `remove` | remove segments | [Segment Group](limitation_reference.md#segment-group-limitation) | +| | `update` | update segments | [Segment Group](limitation_reference.md#segment-group-limitation) | #### Segment groups [[% include 'snippets/commerce_badge.md' %]] | Module | Function | Effect | Possible limitations | |------------------------------|-----------------------|--------------------------------|----------------------| -| `segment_group` | `create` | create Segment Groups | -| | `read` | load Segment Group information | -| | `remove` | remove Segment Groups | -| | `update` | update Segment Groups | +| `segment_group` | `create` | create segment groups | +| | `read` | load segment group information | +| | `remove` | remove segment groups | +| | `update` | update segment groups | #### Shipments [[% include 'snippets/commerce_badge.md' %]] diff --git a/docs/search/aggregation_reference/authorterm_aggregation.md b/docs/search/aggregation_reference/authorterm_aggregation.md index 906eabfbdf..e4a3ce48bb 100644 --- a/docs/search/aggregation_reference/authorterm_aggregation.md +++ b/docs/search/aggregation_reference/authorterm_aggregation.md @@ -1,6 +1,6 @@ # AuthorTermAggregation -The Field-based [AuthorTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-AuthorTermAggregation.html) aggregates search results by the value of the Author Field. +The field-based [AuthorTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-AuthorTermAggregation.html) aggregates search results by the value of the Author field. ## Arguments diff --git a/docs/search/aggregation_reference/checkboxterm_aggregation.md b/docs/search/aggregation_reference/checkboxterm_aggregation.md index fe3f642d23..3a409402b1 100644 --- a/docs/search/aggregation_reference/checkboxterm_aggregation.md +++ b/docs/search/aggregation_reference/checkboxterm_aggregation.md @@ -1,6 +1,6 @@ # CheckboxTermAggregation -The Field-based [CheckboxTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-CheckboxTermAggregation.html) aggregates search results by the value of the Checkbox Field. +The field-based [CheckboxTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-CheckboxTermAggregation.html) aggregates search results by the value of the Checkbox field. ## Arguments diff --git a/docs/search/aggregation_reference/countryterm_aggregation.md b/docs/search/aggregation_reference/countryterm_aggregation.md index c376ebf8ae..f05f7fb4da 100644 --- a/docs/search/aggregation_reference/countryterm_aggregation.md +++ b/docs/search/aggregation_reference/countryterm_aggregation.md @@ -1,6 +1,6 @@ # CountryTermAggregation -The Field-based [CountryTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-CountryTermAggregation.html) aggregates search results by the value of the Country Field. +The field-based [CountryTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-CountryTermAggregation.html) aggregates search results by the value of the Country field. ## Arguments diff --git a/docs/search/aggregation_reference/daterange_aggregation.md b/docs/search/aggregation_reference/daterange_aggregation.md index 864d45bb1b..8610db02ce 100644 --- a/docs/search/aggregation_reference/daterange_aggregation.md +++ b/docs/search/aggregation_reference/daterange_aggregation.md @@ -1,6 +1,6 @@ # DateRangeAggregation -The Field-based [DateRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-DateRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time Field. +The field-based [DateRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-DateRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time field. ## Arguments diff --git a/docs/search/aggregation_reference/datetimerange_aggregation.md b/docs/search/aggregation_reference/datetimerange_aggregation.md index 26fcb233fd..8a70814a5f 100644 --- a/docs/search/aggregation_reference/datetimerange_aggregation.md +++ b/docs/search/aggregation_reference/datetimerange_aggregation.md @@ -1,6 +1,6 @@ # DateTimeRangeAggregation -The Field-based [DateTimeRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-DateTimeRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time Field. +The field-based [DateTimeRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-DateTimeRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time field. ## Arguments diff --git a/docs/search/aggregation_reference/floatrange_aggregation.md b/docs/search/aggregation_reference/floatrange_aggregation.md index 262c023877..6086012648 100644 --- a/docs/search/aggregation_reference/floatrange_aggregation.md +++ b/docs/search/aggregation_reference/floatrange_aggregation.md @@ -1,6 +1,6 @@ # FloatRangeAggregation -The Field-based [FloatRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-FloatRangeAggregation.html) aggregates search results by the value of the Float Field. +The field-based [FloatRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-FloatRangeAggregation.html) aggregates search results by the value of the Float field. ## Arguments diff --git a/docs/search/aggregation_reference/floatstats_aggregation.md b/docs/search/aggregation_reference/floatstats_aggregation.md index c2ccfdac77..710fb5f870 100644 --- a/docs/search/aggregation_reference/floatstats_aggregation.md +++ b/docs/search/aggregation_reference/floatstats_aggregation.md @@ -1,6 +1,6 @@ # FloatStatsAggregation -The Field-based [FloatStatsAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-FloatStatsAggregation.html) aggregates search results by the value of the Float Field +The field-based [FloatStatsAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-FloatStatsAggregation.html) aggregates search results by the value of the Float field and provides statistical information for the values. You can use the provided getters to access the values: - sum (`getSum()`) diff --git a/docs/search/aggregation_reference/integerrange_aggregation.md b/docs/search/aggregation_reference/integerrange_aggregation.md index 53d32118a3..c16e7e8eaf 100644 --- a/docs/search/aggregation_reference/integerrange_aggregation.md +++ b/docs/search/aggregation_reference/integerrange_aggregation.md @@ -1,6 +1,6 @@ # IntegerRangeAggregation -The Field-based [IntegerRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-IntegerRangeAggregation.html) aggregates search results by the value of the Integer Field. +The field-based [IntegerRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-IntegerRangeAggregation.html) aggregates search results by the value of the Integer field. ## Arguments diff --git a/docs/search/aggregation_reference/integerstats_aggregation.md b/docs/search/aggregation_reference/integerstats_aggregation.md index 707a2c8645..f32dac1bce 100644 --- a/docs/search/aggregation_reference/integerstats_aggregation.md +++ b/docs/search/aggregation_reference/integerstats_aggregation.md @@ -1,6 +1,6 @@ # IntegerStatsAggregation -The Field-based [IntegerStatsAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-IntegerStatsAggregation.html) aggregates search results by the value of the Integer Field +The field-based [IntegerStatsAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-IntegerStatsAggregation.html) aggregates search results by the value of the Integer field and provides statistical information for the values. You can use the provided getters to access the values: - sum (`getSum()`) diff --git a/docs/search/aggregation_reference/keywordterm_aggregation.md b/docs/search/aggregation_reference/keywordterm_aggregation.md index 227a685a48..11543be631 100644 --- a/docs/search/aggregation_reference/keywordterm_aggregation.md +++ b/docs/search/aggregation_reference/keywordterm_aggregation.md @@ -1,6 +1,6 @@ # KeywordTermAggregation -The Field-based [KeywordTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-KeywordTermAggregation.html) aggregates search results by the value of the Keyword Field. +The field-based [KeywordTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-KeywordTermAggregation.html) aggregates search results by the value of the Keyword field. ## Arguments diff --git a/docs/search/aggregation_reference/selectionterm_aggregation.md b/docs/search/aggregation_reference/selectionterm_aggregation.md index 989b5527ee..2951cca5bc 100644 --- a/docs/search/aggregation_reference/selectionterm_aggregation.md +++ b/docs/search/aggregation_reference/selectionterm_aggregation.md @@ -1,6 +1,6 @@ # SelectionTermAggregation -The Field-based [SelectionTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-SelectionTermAggregation.html) aggregates search results by the value of the Selection Field. +The field-based [SelectionTermAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-SelectionTermAggregation.html) aggregates search results by the value of the Selection field. ## Arguments diff --git a/docs/search/aggregation_reference/timerange_aggregation.md b/docs/search/aggregation_reference/timerange_aggregation.md index ae7601bb1f..2ef07cc216 100644 --- a/docs/search/aggregation_reference/timerange_aggregation.md +++ b/docs/search/aggregation_reference/timerange_aggregation.md @@ -1,6 +1,6 @@ # TimeRangeAggregation -The Field-based [TimeRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-TimeRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time Field. +The field-based [TimeRangeAggregation](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Aggregation-Field-TimeRangeAggregation.html) aggregates search results by the value of the Date, DateTime or Time field. ## Arguments diff --git a/docs/search/criteria_reference/field_criterion.md b/docs/search/criteria_reference/field_criterion.md index bf4e91a61b..7df0882309 100644 --- a/docs/search/criteria_reference/field_criterion.md +++ b/docs/search/criteria_reference/field_criterion.md @@ -1,17 +1,17 @@ # Field Criterion The [`Field` Search Criterion](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Criterion-Field.html) -searches for content based on the content of one of its Fields. +searches for content based on the content of one of its fields. ## Arguments -- `target` - string representing the identifier of the Field to query +- `target` - string representing the identifier of the field to query - `operator` - operator constant (IN, EQ, GT, GTE, LT, LTE, LIKE, BETWEEN, CONTAINS) - `value` - the value to query for The `LIKE` operator works together with wildcards (`*`). Without a wildcards its results are the same as for the `EQ` operator. -The `CONTAINS` operator works with collection Fields like the Country field type, +The `CONTAINS` operator works with collection fields like the Country field type, enabling you to retrieve results when the query value is one of the values of the collection. Querying for a collection with the `EQ` operator returns result only when the whole collection equals the query values. diff --git a/docs/search/criteria_reference/fulltext_criterion.md b/docs/search/criteria_reference/fulltext_criterion.md index fe2aa9da84..80da04a403 100644 --- a/docs/search/criteria_reference/fulltext_criterion.md +++ b/docs/search/criteria_reference/fulltext_criterion.md @@ -1,7 +1,7 @@ # FullText Criterion The [`FullText` Search Criterion](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Criterion-FullText.html) -searches for content based on the full text content of its Fields. +searches for content based on the full text content of its fields. ## Arguments diff --git a/docs/search/criteria_reference/image_criterion.md b/docs/search/criteria_reference/image_criterion.md index a72d0e080a..6250dae93e 100644 --- a/docs/search/criteria_reference/image_criterion.md +++ b/docs/search/criteria_reference/image_criterion.md @@ -8,7 +8,7 @@ The `Image` Search Criterion searches for image by specified image attributes. ## Arguments -- `fieldDefIdentifier` - string representing the identifier of the Field +- `fieldDefIdentifier` - string representing the identifier of the field - `imageCriteriaData` - array representing image attributes. All attributes are optional. ## Example diff --git a/docs/search/criteria_reference/imagedimensions_criterion.md b/docs/search/criteria_reference/imagedimensions_criterion.md index 8c4ce70289..f16a6eb803 100644 --- a/docs/search/criteria_reference/imagedimensions_criterion.md +++ b/docs/search/criteria_reference/imagedimensions_criterion.md @@ -8,7 +8,7 @@ The `Dimensions` Search Criterion searches for image with specified dimensions. ## Arguments -- `fieldDefIdentifier` - string representing the identifier of the Field +- `fieldDefIdentifier` - string representing the identifier of the field - `imageCriteriaData` - an array representing minimum and maximum values for width and height, expressed in pixels ## Example diff --git a/docs/search/criteria_reference/imagefilesize_criterion.md b/docs/search/criteria_reference/imagefilesize_criterion.md index 741abf1b77..25ef00afba 100644 --- a/docs/search/criteria_reference/imagefilesize_criterion.md +++ b/docs/search/criteria_reference/imagefilesize_criterion.md @@ -8,7 +8,7 @@ The `FileSize` Search Criterion searches for image with specified size. ## Arguments -- `fieldDefIdentifier` - string representing the identifier of the Field +- `fieldDefIdentifier` - string representing the identifier of the field - (optional) `minValue` - numeric representing minimum file size expressed in MB, default: 0 - (optional) `maxValue` - numeric representing maximum file size expressed in MB, default: `null` diff --git a/docs/search/criteria_reference/imageheight_criterion.md b/docs/search/criteria_reference/imageheight_criterion.md index 8df32dc0a2..bdd00bba32 100644 --- a/docs/search/criteria_reference/imageheight_criterion.md +++ b/docs/search/criteria_reference/imageheight_criterion.md @@ -8,7 +8,7 @@ The `Height` Search Criterion searches for image with specified height. ## Arguments -- `fieldDefIdentifier` - string representing the identifier of the Field +- `fieldDefIdentifier` - string representing the identifier of the field - (optional) `minValue` - int representing minimum file height expressed in pixels, default: 0 - (optional) `maxValue` - int representing maximum file height expressed in pixels, default: `null` diff --git a/docs/search/criteria_reference/imagemimetype_criterion.md b/docs/search/criteria_reference/imagemimetype_criterion.md index 543e36f61c..ee011079c3 100644 --- a/docs/search/criteria_reference/imagemimetype_criterion.md +++ b/docs/search/criteria_reference/imagemimetype_criterion.md @@ -8,7 +8,7 @@ The `MimeType` Search Criterion searches for image with specified mime type(s). ## Arguments -- `fielDefIdentifier` - string representing the identifier of the Field +- `fielDefIdentifier` - string representing the identifier of the field - `type` - string(s) representing mime type(s) ## Example diff --git a/docs/search/criteria_reference/imageorientation_criterion.md b/docs/search/criteria_reference/imageorientation_criterion.md index 6a6fa047c9..71838053d9 100644 --- a/docs/search/criteria_reference/imageorientation_criterion.md +++ b/docs/search/criteria_reference/imageorientation_criterion.md @@ -9,7 +9,7 @@ Supported orientation values: landscape, portrait and square. ## Arguments -- `fielDefIdentifier` - string representing the identifier of the Field +- `fielDefIdentifier` - string representing the identifier of the field - `orientation` - strings representing orientations ## Example diff --git a/docs/search/criteria_reference/imagewidth_criterion.md b/docs/search/criteria_reference/imagewidth_criterion.md index bf9f479070..2a3986f225 100644 --- a/docs/search/criteria_reference/imagewidth_criterion.md +++ b/docs/search/criteria_reference/imagewidth_criterion.md @@ -8,7 +8,7 @@ The `Width` Search Criterion searches for image with specified width. ## Arguments -- `fieldDefIdentifier` - string representing the identifier of the Field +- `fieldDefIdentifier` - string representing the identifier of the field - (optional) `minValue` - int representing minimum file width expressed in pixels, default: 0 - (optional) `maxValue` - int representing maximum file width expressed in pixels, default: `null` diff --git a/docs/search/criteria_reference/isfieldempty_criterion.md b/docs/search/criteria_reference/isfieldempty_criterion.md index 8eea7bde20..0151abf906 100644 --- a/docs/search/criteria_reference/isfieldempty_criterion.md +++ b/docs/search/criteria_reference/isfieldempty_criterion.md @@ -5,9 +5,9 @@ searches for content based on whether a specified Field is empty or not. ## Arguments -- `fieldDefinitionIdentifier` - string representing the identifier of the Field +- `fieldDefinitionIdentifier` - string representing the identifier of the field - (optional) `value` - bool representing whether to search for empty (default `true`), -or non-empty Fields (`false`) +or non-empty fields (`false`) ## Limitations diff --git a/docs/search/criteria_reference/maplocationdistance_criterion.md b/docs/search/criteria_reference/maplocationdistance_criterion.md index d4b30223bf..7d93ce0583 100644 --- a/docs/search/criteria_reference/maplocationdistance_criterion.md +++ b/docs/search/criteria_reference/maplocationdistance_criterion.md @@ -1,13 +1,13 @@ # MapLocationDistance Criterion The [`MapLocationDistance` Search Criterion](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Criterion-MapLocationDistance.html) -searches content based on the distance between the location contained in a MapLocation Field and the provided coordinates. +searches content based on the distance between the location contained in a MapLocation field and the provided coordinates. ## Arguments -- `target` - string representing the Field definition identifier +- `target` - string representing the field definition identifier - `operator` - Operator constant (IN, EQ, GT, GTE, LT, LTE, BETWEEN) -- `distance` - float(s) representing the distances between the map location in the Field and the location provided in `latitude` and `longitude` arguments +- `distance` - float(s) representing the distances between the map location in the field and the location provided in `latitude` and `longitude` arguments - `latitude` - float representing the latitude of the location to calculate distance to - `longitude` - float representing the longitude of the location to calculate distance to diff --git a/docs/search/criteria_reference/search_criteria_reference.md b/docs/search/criteria_reference/search_criteria_reference.md index be07642c2b..83d3ce4df1 100644 --- a/docs/search/criteria_reference/search_criteria_reference.md +++ b/docs/search/criteria_reference/search_criteria_reference.md @@ -9,7 +9,7 @@ Search Criteria are filters for Content and Location Search and Criteria can take some of the following arguments: -- `target` - when the Criterion supports targeting a specific Field, example: `FieldDefinition` or Metadata identifier +- `target` - when the Criterion supports targeting a specific field, example: `FieldDefinition` or Metadata identifier - `value` - the value(s) to filter on, typically a scalar or array of scalars - `operator` - constants on `Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Operator`: `IN`, `EQ`, `GT`, `GTE`, `LT`, `LTE`, `LIKE`, `BETWEEN`, `CONTAINS`. Most Criteria do not expose this and select `EQ` or `IN` depending on whether the value is scalar or an array. `IN` and `BETWEEN` always act on an array of values, while the other operators act on single scalar value - `valueData` - additional value data, required by some Criteria, for instance `MapLocationDistance` @@ -32,9 +32,9 @@ Due to this storage limitation, searching content using the Country field type o |[CurrencyCodeCriterion](currencycode_criterion.md)|Currency code|✔ |✔ |✔ | |[DateMetadata](datemetadata_criterion.md)|The date when content was created or last modified|✔ |✔ |✔ | |[Depth](depth_criterion.md)|Location depth in the content tree| |✔ |✔ | -|[Field](field_criterion.md)|Content of one of content item's Fields|✔ |✔ | | +|[Field](field_criterion.md)|Content of one of content item's fields|✔ |✔ | | |[FieldRelation](fieldrelation_criterion.md)|Content items the content in question has Relations to|✔ |✔ | | -|[FullText](fulltext_criterion.md)|Full text content of a content item's Fields|✔ |✔ | | +|[FullText](fulltext_criterion.md)|Full text content of a content item's fields|✔ |✔ | | |[Image](image_criterion.md)|Image by specified image attributes|✔|✔|| |[ImageDimensions](imagedimensions_criterion.md)|Image dimensions: height and width|✔|✔|| |[ImageFileSize](imagefilesize_criterion.md)|Image size in MB|✔|✔|| @@ -43,7 +43,7 @@ Due to this storage limitation, searching content using the Country field type o |[ImageOrientation](imageorientation_criterion.md)|Image orientation|✔|✔|| |[ImageWidth](imagewidth_criterion.md)|Image width in pixels|✔|✔|| |[IsCurrencyEnabledCriterion](iscurrencyenabled_criterion.md)|Whether a specified currency is enabled in the system| | | | -|[IsFieldEmpty](isfieldempty_criterion.md)|Whether a specified Field of a content item is empty or not|✔ |✔ | | +|[IsFieldEmpty](isfieldempty_criterion.md)|Whether a specified field of a content item is empty or not|✔ |✔ | | |[IsMainLocation](ismainlocation_criterion.md)|Whether a Location is the main Location of a content item| |✔ |✔ | |[IsProductBased](isproductbased_criterion.md)|Whether content represents a product|✔ |✔ |✔ | |[IsUserBased](isuserbased_criterion.md)|Whether content represents a User account|✔ |✔ |✔ | @@ -51,7 +51,7 @@ Due to this storage limitation, searching content using the Country field type o |[LanguageCode](languagecode_criterion.md)|Whether a content item is translated into the selected language|✔ |✔ |✔ | |[LocationId](locationid_criterion.md)|Location ID|✔ |✔ |✔ | |[LocationRemoteId](locationremoteid_criterion.md)|Location remote ID|✔ |✔ |✔ | -|[MapLocationDistance](maplocationdistance_criterion.md)|Distance between the location contained in a MapLocation Field and the provided coordinates|✔ |✔ | | +|[MapLocationDistance](maplocationdistance_criterion.md)|Distance between the location contained in a MapLocation field and the provided coordinates|✔ |✔ | | |[MatchAll](matchall_criterion.md)|Returns all search results|✔ |✔ |✔ | |[MatchNone](matchnone_criterion.md)|Returns no search results|✔ |✔ |✔ | |[ObjectStateId](objectstateid_criterion.md)|Object State ID|✔ |✔ |✔ | diff --git a/docs/search/extensibility/create_custom_aggregation.md b/docs/search/extensibility/create_custom_aggregation.md index 158ab68f94..3555cc4ed8 100644 --- a/docs/search/extensibility/create_custom_aggregation.md +++ b/docs/search/extensibility/create_custom_aggregation.md @@ -35,7 +35,7 @@ interface or inherit one of following abstract classes: An aggregation can also implement one of the following interfaces: -- `Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation\FieldAggregation`, based on content Field +- `Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation\FieldAggregation`, based on content field - `Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation\LocationAggregation`, based on content Location - `Ibexa\Contracts\Core\Repository\Values\Content\Query\Aggregation\RawAggregation`, based on details of the index structure @@ -44,7 +44,7 @@ An aggregation can also implement one of the following interfaces: An aggregation definition must contain at least the name of an aggregation and optional aggregation parameters, such as, for example, the path (string) that is used to limit aggregation results to a specific subtree, Content - Type identifier, or Field definition identifier, which is mapped + Type identifier, or field definition identifier, which is mapped to the search index field name. Aggregation definition must be independent of the search engine used. diff --git a/docs/search/search_api.md b/docs/search/search_api.md index 6fcfd29472..13f2f1fdd1 100644 --- a/docs/search/search_api.md +++ b/docs/search/search_api.md @@ -39,7 +39,7 @@ The following command takes the content type identifier as an argument and lists [`SearchService::findContentInfo`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html#method_findContentInfo) (line 16) retrieves [`ContentInfo`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Persistence-Content-ContentInfo.html) objects of the found content items. -You can also use [`SearchService::findContent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html#method_findContent) to get full Content objects, together with their Field information. +You can also use [`SearchService::findContent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html#method_findContent) to get full Content objects, together with their field information. To query for a single result, for example by providing a Content ID, use the [`SearchService::findSingle`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-SearchService.html#method_findSingle) method: @@ -354,11 +354,11 @@ Aggregation results contain the name of the result and the count of found items: [[= include_file('code_samples/api/public_php_api/src/Command/FindWithAggregationCommand.php', 46, 49) =]] ``` -With field aggregations you can group search results according to the value of a specific Field. -In this case the aggregation takes the content type identifier and the Field identifier as parameters. +With field aggregations you can group search results according to the value of a specific field. +In this case the aggregation takes the content type identifier and the field identifier as parameters. The following example creates an aggregation named `selection` that groups results -according to the value of the `topic` Field in the `article` content type: +according to the value of the `topic` field in the `article` content type: ``` php [[= include_file('code_samples/api/public_php_api/src/Command/FindWithAggregationCommand.php', 39, 40) =]] diff --git a/docs/search/search_criteria_and_sort_clauses.md b/docs/search/search_criteria_and_sort_clauses.md index 165ef184e8..7a92203ad4 100644 --- a/docs/search/search_criteria_and_sort_clauses.md +++ b/docs/search/search_criteria_and_sort_clauses.md @@ -20,7 +20,7 @@ or [`ContentId` Criterion handler](https://github.com/ibexa/solr/blob/main/src/l ## Custom Criteria and Sort Clauses -Sometimes you can find that standard Search Criteria and Sort Clauses provided with [[= product_name =]] aren't sufficient for your needs. Most often this is the case if you have a custom field type using external storage which cannot be searched using the standard Field Criterion. +Sometimes you can find that standard Search Criteria and Sort Clauses provided with [[= product_name =]] aren't sufficient for your needs. Most often this is the case if you have a custom field type using external storage which cannot be searched using the standard field Criterion. !!!note diff --git a/docs/search/search_engines/search_engines.md b/docs/search/search_engines/search_engines.md index a710ddf405..7b4556a7a3 100644 --- a/docs/search/search_engines/search_engines.md +++ b/docs/search/search_engines/search_engines.md @@ -21,7 +21,7 @@ Currently, they exist in their own [[= product_name =]] Bundles: | Index-time boosting | No | No | Query-time boosting\*\*\* | | Aggregations | No | Yes | Yes | -\* Usage of Criteria and Sort Clauses for Fields does not perform well on medium to larger +\* Usage of Criteria and Sort Clauses for fields does not perform well on medium to larger amount of data with Legacy Search Engine (SQL). \*\* For more information about fulltext search syntax support, see [Fulltext Criterion](fulltext_criterion.md). diff --git a/docs/search/search_engines/solr_search_engine/configure_solr.md b/docs/search/search_engines/solr_search_engine/configure_solr.md index 668fb6a88e..e3a00e663a 100644 --- a/docs/search/search_engines/solr_search_engine/configure_solr.md +++ b/docs/search/search_engines/solr_search_engine/configure_solr.md @@ -118,7 +118,7 @@ The configuration above results in the following boosting (content type / Field) Remember to clear the cache and perform search engine reindex afterwords. - The above configuration results in the following boosting (content type / Field): + The above configuration results in the following boosting (content type / field): - `folder/name: 20.0` - `folder/description: 10.0` diff --git a/docs/search/sort_clause_reference/field_sort_clause.md b/docs/search/sort_clause_reference/field_sort_clause.md index c4b1758ff6..ef63a746ce 100644 --- a/docs/search/sort_clause_reference/field_sort_clause.md +++ b/docs/search/sort_clause_reference/field_sort_clause.md @@ -1,15 +1,15 @@ # Field Sort Clause The [`Field` Sort Clause](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-SortClause-Field.html) -sorts search results by the value of one of the content items' Fields. +sorts search results by the value of one of the content items' fields. -Search results of the provided content type are sorted in Field value order. +Search results of the provided content type are sorted in field value order. Results of the query that do not belong to the content type are ranked lower. ## Arguments -- `typeIdentifier` - string representing the identifier of the content type to which the Field belongs -- `fieldIdentifier` - string representing the identifier of the Field to sort by +- `typeIdentifier` - string representing the identifier of the content type to which the field belongs +- `fieldIdentifier` - string representing the identifier of the field to sort by [[= include_file('docs/snippets/sort_direction.md') =]] ## Limitations diff --git a/docs/search/sort_clause_reference/maplocationdistance_sort_clause.md b/docs/search/sort_clause_reference/maplocationdistance_sort_clause.md index 2ea5d75833..19a9058640 100644 --- a/docs/search/sort_clause_reference/maplocationdistance_sort_clause.md +++ b/docs/search/sort_clause_reference/maplocationdistance_sort_clause.md @@ -1,12 +1,12 @@ # MapLocationDistance Sort Clause The [`MapLocationDistance` Sort Clause](../../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-SortClause-MapLocationDistance.html) -sorts search results by the distance of the indicated MapLocation Field to the provided location. +sorts search results by the distance of the indicated MapLocation field to the provided location. ## Arguments -- `typeIdentifier` - string representing the identifier of the content type to which the MapLocation Field belongs -- `fieldIdentifier` - string representing the identifier of the MapLocation Field to sort by +- `typeIdentifier` - string representing the identifier of the content type to which the MapLocation field belongs +- `fieldIdentifier` - string representing the identifier of the MapLocation field to sort by - `latitude` - float representing the latitude of the location to calculate distance to - `longitude`- float representing the longitude of the location to calculate distance to [[= include_file('docs/snippets/sort_direction.md') =]] diff --git a/docs/search/sort_clause_reference/sort_clause_reference.md b/docs/search/sort_clause_reference/sort_clause_reference.md index f9e9290e58..3b17725741 100644 --- a/docs/search/sort_clause_reference/sort_clause_reference.md +++ b/docs/search/sort_clause_reference/sort_clause_reference.md @@ -25,10 +25,10 @@ All Sort Clauses can take the following optional argument: | [DateModified](datemodified_sort_clause.md) | The date when content was last modified | ✔ | ✔ | ✔ | | [DatePublished](datepublished_sort_clause.md) | The date when content was created | ✔ | ✔ | ✔ | | [Depth](depth_sort_clause.md) | Location depth in the content tree | | ✔ | ✔ | -| [Field](field_sort_clause.md) | Content of one of content item's Fields | ✔ | ✔ | | +| [Field](field_sort_clause.md) | Content of one of content item's fields | ✔ | ✔ | | | [Id](id_sort_clause.md) | Location ID | | ✔ | ✔ | | [IsMainLocation](ismainlocation_sort_clause.md) | Whether a Location is the main Location of a content item | | ✔ | | -| [MapLocationDistance](maplocationdistance_sort_clause.md) | Distance between the location contained in a MapLocation Field and the provided coordinates | ✔ | ✔ | | +| [MapLocationDistance](maplocationdistance_sort_clause.md) | Distance between the location contained in a MapLocation field and the provided coordinates | ✔ | ✔ | | | [Path](path_sort_clause.md) | PathString of the Location | | ✔ | ✔ | | [Priority](priority_sort_clause.md) | Location priority | | ✔ | ✔ | | [Random](random_sort_clause.md) | Random seed | ✔ | ✔ | | diff --git a/docs/tutorials/beginner_tutorial/2_create_the_content_model.md b/docs/tutorials/beginner_tutorial/2_create_the_content_model.md index 02b0453b04..a515ce1ee3 100644 --- a/docs/tutorials/beginner_tutorial/2_create_the_content_model.md +++ b/docs/tutorials/beginner_tutorial/2_create_the_content_model.md @@ -14,7 +14,7 @@ Below is a short introduction that only covers points needed for this tutorial. The [[= product_name =]] content repository is centered around **content items**. A content item is a single piece of content, for example an article, a product review, a place, etc. Every content item is an instance of a content type. Content types define what **Fields** are included in each content item. -For example, an article could include Fields such as *title*, *image*, *abstract*, *article's body*, *publication date* and *list of authors*. +For example, an article could include fields such as *title*, *image*, *abstract*, *article's body*, *publication date* and *list of authors*. Fields can belong to one of the installed **field types**, about 30 in the default distribution. Each field type is built to represent a specific type of data: a text line, a block of rich text, an image, a collection of relations to content items, etc. @@ -46,7 +46,7 @@ Fill the form with this basic info:  - **Name**: Ride - **Identifier**: `ride` -Then create all Fields with the following information:  +Then create all fields with the following information:  | Field type | Name | Identifier | Required | Searchable | Translatable | | ------------ | ---------------- | ---------------- | --------- | ---------- | ------------ | diff --git a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md index 15deaca6ca..1bb83b4f18 100644 --- a/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md +++ b/docs/tutorials/beginner_tutorial/5_display_a_list_of_content_items.md @@ -175,7 +175,7 @@ Because this template is rendered inside a table, it starts with a `