mirror of
https://github.com/code-rhapsodie/ezdataflow-bundle.git
synced 2026-03-24 14:42:06 +01:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3da715371b | ||
|
|
02a713a6e1 | ||
|
|
411fd42471 | ||
|
|
0b295ba5d7 | ||
|
|
1be233b29d | ||
|
|
675ea28328 | ||
|
|
877d537d74 | ||
|
|
a71d473c39 | ||
|
|
bd47a8d3c2 | ||
|
|
8ab924cf83 | ||
|
|
d0367d76e1 |
27
.github/workflows/build.yml
vendored
Normal file
27
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
permissions: read-all
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||
- uses: sonarsource/sonarqube-scan-action@master
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
||||
# If you wish to fail your job when the Quality Gate is red, uncomment the
|
||||
# following lines. This would typically be used to fail a deployment.
|
||||
# - uses: sonarsource/sonarqube-quality-gate-action@master
|
||||
# timeout-minutes: 5
|
||||
# env:
|
||||
# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
26
.github/workflows/semicolons-kudos.yaml
vendored
Normal file
26
.github/workflows/semicolons-kudos.yaml
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
name: Kudos for Code
|
||||
on:
|
||||
push:
|
||||
branches: ["master"]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
kudos:
|
||||
name: Semicolons Kudos
|
||||
permissions: write-all
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: LoremLabs/kudos-for-code-action@latest
|
||||
with:
|
||||
search-dir: "."
|
||||
destination: "artifact"
|
||||
generate-nomerges: true
|
||||
generate-validemails: true
|
||||
generate-limitdepth: 0
|
||||
generate-fromrepo: true
|
||||
analyze-repo: false
|
||||
skip-ids: ""
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,3 +1,16 @@
|
||||
# Version 4.1.2
|
||||
|
||||
* Fix main menu label
|
||||
* Fix redirection after adding a new oneshot job
|
||||
|
||||
# Version 4.1.1
|
||||
|
||||
* Fix NotModifiedContentFilter when creating new translation
|
||||
|
||||
# Version 4.1.0
|
||||
|
||||
* Allow Dataflow 4 by @jeremycr in https://github.com/code-rhapsodie/ezdataflow-bundle/pull/44
|
||||
|
||||
# Version 4.0.0
|
||||
|
||||
* Add compatibility with Ibexa 4.0+ and drop compatibility for eZPlatform 2 and Ibexa 3
|
||||
|
||||
136
README.md
136
README.md
@@ -1,18 +1,31 @@
|
||||
# Code Rhapsodie eZ Dataflow Bundle
|
||||
# Code Rhapsodie Ibexa Dataflow Bundle
|
||||
|
||||
EzDataflowBundle is a bundle integrating [Code Rhapsodie Dataflow bundle](https://github.com/code-rhapsodie/dataflow-bundle) into Ibexa 4.0+.
|
||||
### ⚠️ This project has been relocated to [ibexa-dataflow-bundle](https://github.com/code-rhapsodie/ibexa-dataflow-bundle). All future development and issues will be tracked there.
|
||||
|
||||
Ibexa DataflowBundle is a bundle
|
||||
integrating [Code Rhapsodie Dataflow bundle](https://github.com/code-rhapsodie/dataflow-bundle) into Ibexa 4.0+.
|
||||
Dataflows can be piloted from an interface integrated into the Ibexa backoffice.
|
||||
EzDataflow bundle is intended to manage content imports from external data sources.
|
||||
Ibexa Dataflow bundle is intended to manage content imports from external data sources.
|
||||
|
||||
> Note: before using this bundle, please read the [Code Rhapsodie Dataflow bundle documentation](https://github.com/code-rhapsodie/dataflow-bundle/blob/master/README.md).
|
||||
> Note: before using this bundle, please read
|
||||
> the [Code Rhapsodie Dataflow bundle documentation](https://github.com/code-rhapsodie/dataflow-bundle/blob/master/README.md).
|
||||
|
||||
> Command line notice: When you use Dataflow commands, **use `--siteaccess` instead of `--connection`** expect for `code-rhapsodie:dataflow:dump-schema` command.
|
||||
> Command line notice: When you use Dataflow commands, **use `--siteaccess` instead of `--connection`** expect
|
||||
> for `code-rhapsodie:dataflow:dump-schema` command.
|
||||
|
||||
| Ibexa Dataflow Version | Ibexa Content Version | Status |
|
||||
|---------------------|-----------------------|------------------------------|
|
||||
| 4.x | 4.x | :white_check_mark: Maintened |
|
||||
| 3.x | 3.x | :white_check_mark: Maintened |
|
||||
| 2.x | eZ Platform 2.5 | :x: Not maintened |
|
||||
| 1.x | eZ Platform 2.5 | :x: Not maintained |
|
||||
|
||||
## User Interface (UI)
|
||||
|
||||
The UI lets you create workflow processes from any defined `DataflowTypes`, and set options to each.
|
||||
|
||||
Processes can be set to run either:
|
||||
|
||||
- only once, at a given date and time
|
||||
- regularly, by defining the first run date and time, and the interval between subsequent runs
|
||||
|
||||
@@ -26,7 +39,8 @@ $ composer require code-rhapsodie/ezdataflow-bundle
|
||||
|
||||
### Step 2: Enable the bundle
|
||||
|
||||
> Note: The loading order between the Dataflow bundle and Ez Dataflow bundle is important. Dataflow must be loaded first.
|
||||
> Note: The loading order between the Dataflow bundle and Ez Dataflow bundle is important. Dataflow must be loaded
|
||||
> first.
|
||||
|
||||
Add those two lines in the `config/bundles.php` file:
|
||||
|
||||
@@ -47,32 +61,36 @@ return [
|
||||
# config/routing/ezdataflow.yaml
|
||||
|
||||
_cr.dataflow:
|
||||
resource: '@CodeRhapsodieEzDataflowBundle/Resources/config/routing.yaml'
|
||||
resource: '@CodeRhapsodieEzDataflowBundle/Resources/config/routing.yaml'
|
||||
```
|
||||
|
||||
### Step 4: Update the database schema
|
||||
|
||||
Please refer to the [Code-Rhapsodie Dataflow Bundle installation guide](https://github.com/code-rhapsodie/dataflow-bundle#update-the-database).
|
||||
Please refer to
|
||||
the [Code-Rhapsodie Dataflow Bundle installation guide](https://github.com/code-rhapsodie/dataflow-bundle#update-the-database).
|
||||
|
||||
### Step 5: Schedule the job runner
|
||||
|
||||
Please refer to the [Code-Rhapsodie Dataflow Bundle Queue section](https://github.com/code-rhapsodie/dataflow-bundle#queue).
|
||||
Please refer to
|
||||
the [Code-Rhapsodie Dataflow Bundle Queue section](https://github.com/code-rhapsodie/dataflow-bundle#queue).
|
||||
|
||||
## Configuration
|
||||
|
||||
By default, the `ContentWriter` will publish contents using the `admin` user. If you want to use another user (with sufficient permissions), you can configure it like this:
|
||||
By default, the `ContentWriter` will publish contents using the `admin` user. If you want to use another user (with
|
||||
sufficient permissions), you can configure it like this:
|
||||
|
||||
```yaml
|
||||
# config/packages/code_rhapsodie_ez_dataflow.yaml
|
||||
|
||||
code_rhapsodie_ez_dataflow:
|
||||
# Integer values are assumed to be user ids, non-integer values are assumed to be user logins
|
||||
admin_login_or_id: webmaster
|
||||
# Integer values are assumed to be user ids, non-integer values are assumed to be user logins
|
||||
admin_login_or_id: webmaster
|
||||
```
|
||||
|
||||
## Define your Dataflow
|
||||
|
||||
Before using the admin UI to manage your dataflows, you need to define them. Please refer to [Code-Rhapsodie Dataflow type documentation](https://github.com/code-rhapsodie/dataflow-bundle#define-a-dataflow-type).
|
||||
Before using the admin UI to manage your dataflows, you need to define them. Please refer
|
||||
to [Code-Rhapsodie Dataflow type documentation](https://github.com/code-rhapsodie/dataflow-bundle#define-a-dataflow-type).
|
||||
|
||||
## Use the ContentWriter
|
||||
|
||||
@@ -80,7 +98,8 @@ To add or update Ibexa contents, you can use the `CodeRhapsodie\EzDataflowBundle
|
||||
|
||||
### Step 1: Inject the dependencies and add the writer
|
||||
|
||||
Inject the `ContentWriter` service into the constructor of your DataflowType and add the content writer into the writer list like this:
|
||||
Inject the `ContentWriter` service into the constructor of your DataflowType and add the content writer into the writer
|
||||
list like this:
|
||||
|
||||
```php
|
||||
// In your DataflowType
|
||||
@@ -112,31 +131,37 @@ class MyDataflowType extends AbstractDataflowType
|
||||
|
||||
### Step 2: Add a step for prepare the content
|
||||
|
||||
To process Ibexa contents into your Dataflow, you need to transform the data into `ContentCreateStructure` or `ContentUpdateStructure` objects.
|
||||
To process Ibexa contents into your Dataflow, you need to transform the data into `ContentCreateStructure`
|
||||
or `ContentUpdateStructure` objects.
|
||||
in order to respectively create or update contents.
|
||||
|
||||
But, in order to determine if the content already exists or not, you first need to look up for it.
|
||||
|
||||
One way is to use the remote id to search for the content.
|
||||
|
||||
In the following example, the remote id pattern is `article-<id>` with the `<id>` replaced by the data id provided by the reader.
|
||||
In the following example, the remote id pattern is `article-<id>` with the `<id>` replaced by the data id provided by
|
||||
the reader.
|
||||
To check if the content exists or not, I use the service `ContentService` provided by Ibexa.
|
||||
|
||||
The step is added as an anonymous function and has 3 types of return values:
|
||||
|
||||
* When the step returns `false`, the data is dropped.
|
||||
* When the step returns a `ContentCreateStructure`, the data will be saved into a new Ibexa content.
|
||||
* When the step returns a `ContentUpdateStructure`, the existing Ibexa content will be updated by overwriting all defined fields in the data.
|
||||
* When the step returns a `ContentUpdateStructure`, the existing Ibexa content will be updated by overwriting all
|
||||
defined fields in the data.
|
||||
|
||||
For the new content, you must provide one or more "parent location id" as the 3rd argument of the `ContentCreateStructure` constructor.
|
||||
For the new content, you must provide one or more "parent location id" as the 3rd argument of
|
||||
the `ContentCreateStructure` constructor.
|
||||
|
||||
In this example, I have added a new folder to store all articles.
|
||||
|
||||
To get the location id of the parent Ibexa content, go to the admin UI and select the future parent content, click on the details tabs, and read the "Location id" like this:
|
||||
To get the location id of the parent Ibexa content, go to the admin UI and select the future parent content, click on
|
||||
the details tabs, and read the "Location id" like this:
|
||||
|
||||

|
||||
|
||||
> Note: the best practice is to define this parent id in your `parameters.yml` file or your `.env.local` file for each execution environment.
|
||||
> Note: the best practice is to define this parent id in your `parameters.yml` file or your `.env.local` file for each
|
||||
> execution environment.
|
||||
|
||||
```php
|
||||
// In your DataflowType
|
||||
@@ -192,11 +217,13 @@ class MyDataflowType extends AbstractDataflowType
|
||||
}
|
||||
```
|
||||
|
||||
This example uses `ContentStructureFactory` to check if the content exists and returns the adequate `ContentStrucure` to pass to the content writer.
|
||||
This example uses `ContentStructureFactory` to check if the content exists and returns the adequate `ContentStrucure` to
|
||||
pass to the content writer.
|
||||
|
||||
## Use the NotModifiedContentFilter
|
||||
|
||||
When updating contents, you might want to ignore contents where the update would not result in any actual changes in fields values. In that case, you can add the `NotModifiedContentFilter` as one of your steps.
|
||||
When updating contents, you might want to ignore contents where the update would not result in any actual changes in
|
||||
fields values. In that case, you can add the `NotModifiedContentFilter` as one of your steps.
|
||||
|
||||
```php
|
||||
// In your DataflowType
|
||||
@@ -216,11 +243,16 @@ protected function buildDataflow(DataflowBuilder $builder, array $options): void
|
||||
}
|
||||
```
|
||||
|
||||
This filter compares each field value in the `ContentUpdateStructure` received to the fields values in the existing content object. If all values are identical, this filter will return `false`, otherwise, the `ContentUpdateStructure` will be returned as is.
|
||||
This filter compares each field value in the `ContentUpdateStructure` received to the fields values in the existing
|
||||
content object. If all values are identical, this filter will return `false`, otherwise, the `ContentUpdateStructure`
|
||||
will be returned as is.
|
||||
|
||||
Not all field types are supported by this filter. Il a field type is not supported, values will be assumed different. If your dataflow is dealing with content types containing unsupported field types, it is better to simply not use the `NotModifiedContentFilter` to prevent unnecessary overhead.
|
||||
Not all field types are supported by this filter. Il a field type is not supported, values will be assumed different. If
|
||||
your dataflow is dealing with content types containing unsupported field types, it is better to simply not use
|
||||
the `NotModifiedContentFilter` to prevent unnecessary overhead.
|
||||
|
||||
### Supported field types
|
||||
|
||||
- ezstring
|
||||
- ezauthor
|
||||
- ezboolean
|
||||
@@ -267,51 +299,55 @@ class MyFieldComparator extends AbstractFieldComparator
|
||||
|
||||
```yaml
|
||||
# Service declaration
|
||||
App\FieldComparator\MyFieldComparator:
|
||||
parent: 'CodeRhapsodie\EzDataflowBundle\Core\FieldComparator\AbstractFieldComparator'
|
||||
tags:
|
||||
- { name: 'coderhapsodie.ezdataflow.field_comparator', fieldType: 'my_field_type_identifier' }
|
||||
App\FieldComparator\MyFieldComparator:
|
||||
parent: 'CodeRhapsodie\EzDataflowBundle\Core\FieldComparator\AbstractFieldComparator'
|
||||
tags:
|
||||
- { name: 'coderhapsodie.ezdataflow.field_comparator', fieldType: 'my_field_type_identifier' }
|
||||
```
|
||||
|
||||
# Admin UI
|
||||
|
||||
## Access to the eZ Dataflow UI
|
||||
## Access to the Ibexa Dataflow UI
|
||||
|
||||
You can access the eZ Dataflow administration UI from your Ibexa admin back-office.
|
||||
You can access the Ibexa Dataflow administration UI from your Ibexa admin back-office.
|
||||
|
||||

|
||||
|
||||
1. Click to "Admin"
|
||||
1. Click to "eZ Dataflow"
|
||||
1. Click to "Ibexa Dataflow"
|
||||
|
||||
## Scheduled dataflow list
|
||||
|
||||
When you access to the eZ Dataflow administration UI, you going here:
|
||||
When you access to the Ibexa Dataflow administration UI, you going here:
|
||||
|
||||

|
||||
|
||||
1. Scheduled dataflow list
|
||||
1. Button to add a new scheduled dataflow
|
||||
1. Tools available for each scheduled dataflow. In order from left to right :
|
||||
1. Display the history for this dataflow schedule
|
||||
1. Edit this dataflow schedule
|
||||
1. Enable/Disable this dataflow schedule
|
||||
1. Delete this dataflow schedule
|
||||
1. Display the history for this dataflow schedule
|
||||
1. Edit this dataflow schedule
|
||||
1. Enable/Disable this dataflow schedule
|
||||
1. Delete this dataflow schedule
|
||||
|
||||
> Note: You can define more than one schedule for any given dataflow.
|
||||
|
||||
## Add a new schedule
|
||||
|
||||
Go to the eZ Dataflow admin, and click on the "+" orange button.
|
||||
Go to the Ibexa Dataflow admin, and click on the "+" orange button.
|
||||
|
||||
In the new popin, fill in the fields:
|
||||
|
||||

|
||||
|
||||
1. Type the Dataflow schedule name
|
||||
1. Select the Dataflow type. The list is automatically generated from the list of Symfony services with the tags `coderhapsodie.dataflow.type`. If your dataflow type is not present, [check the configuration](https://github.com/code-rhapsodie/dataflow-bundle#check-if-your-dataflowtype-is-ready)
|
||||
1. Type here the Dataflow options. Basic expected format: one option per line and option name and value separated with `: `. For more complex options, the whole YAML format is supported.
|
||||
1. Type here the frequency. The value must be compatible with the the PHP [strtotime](https://www.php.net/manual/en/function.strtotime.php) function.
|
||||
1. Select the Dataflow type. The list is automatically generated from the list of Symfony services with the
|
||||
tags `coderhapsodie.dataflow.type`. If your dataflow type is not
|
||||
present, [check the configuration](https://github.com/code-rhapsodie/dataflow-bundle#check-if-your-dataflowtype-is-ready)
|
||||
1. Type here the Dataflow options. Basic expected format: one option per line and option name and value separated
|
||||
with `: `. For more complex options, the whole YAML format is supported.
|
||||
1. Type here the frequency. The value must be compatible with the the
|
||||
PHP [strtotime](https://www.php.net/manual/en/function.strtotime.php) function.
|
||||
1. Choose the date and time of the first job.
|
||||
1. Check if you want to run this Dataflow.
|
||||
|
||||
@@ -319,7 +355,8 @@ Finally, click on the "Create" button.
|
||||
|
||||
## Read the history
|
||||
|
||||
When you click on the "History" tab in the eZ Dataflow admin UI, the job history for all Dataflow configured and executed is displayed.
|
||||
When you click on the "History" tab in the Ibexa Dataflow admin UI, the job history for all Dataflow configured and
|
||||
executed is displayed.
|
||||
|
||||

|
||||
|
||||
@@ -335,7 +372,7 @@ Details of one scheduled job:
|
||||
|
||||
If you don't want to run a Dataflow periodically, you can add a single execution at the time and date that you want.
|
||||
|
||||
Go to the eZ Dataflow admin UI and click on the "Oneshot" tab.
|
||||
Go to the Ibexa Dataflow admin UI and click on the "Oneshot" tab.
|
||||
|
||||

|
||||
|
||||
@@ -351,20 +388,24 @@ Here the job has fail.
|
||||
|
||||
## Add a one-shot job
|
||||
|
||||
Go to the eZ Dataflow admin UI and click on the "Oneshot" tab. Click on the "+" orange button to open the adding popin.
|
||||
Go to the Ibexa Dataflow admin UI and click on the "Oneshot" tab. Click on the "+" orange button to open the adding popin.
|
||||
|
||||

|
||||
|
||||
1. Type the Dataflow job name
|
||||
1. Select the Dataflow type. The list is automatically generated from the list of Symfony services with the tags `coderhapsodie.dataflow.type`. If your dataflow type is not present, [check the configuration](https://github.com/code-rhapsodie/dataflow-bundle#check-if-your-dataflowtype-is-ready)
|
||||
1. Type here the Dataflow options. Basic expected format: one option per line and option name and value separated with `: `. For more complex options, the whole YAML format is supported.
|
||||
1. Select the Dataflow type. The list is automatically generated from the list of Symfony services with the
|
||||
tags `coderhapsodie.dataflow.type`. If your dataflow type is not
|
||||
present, [check the configuration](https://github.com/code-rhapsodie/dataflow-bundle#check-if-your-dataflowtype-is-ready)
|
||||
1. Type here the Dataflow options. Basic expected format: one option per line and option name and value separated
|
||||
with `: `. For more complex options, the whole YAML format is supported.
|
||||
1. Choose the date and time of the first job.
|
||||
|
||||
Finally, click on the "Create" button.
|
||||
|
||||
# Rights
|
||||
|
||||
If a non-administrator user needs read-only access to the dataflow interface, add the `Setup / Administrate` and `eZ Dataflow / View` policies in one of their roles.
|
||||
If a non-administrator user needs read-only access to the dataflow interface, add the `Setup / Administrate`
|
||||
and `Ibexa Dataflow / View` policies in one of their roles.
|
||||
|
||||
# Issues and feature requests
|
||||
|
||||
@@ -373,7 +414,8 @@ Please report issues and request features at https://github.com/code-rhapsodie/e
|
||||
# Contributing
|
||||
|
||||
Contributions are very welcome. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for
|
||||
details. Thanks to [everyone who has contributed](https://github.com/code-rhapsodie/ezdataflow-bundle/graphs/contributors)
|
||||
details. Thanks
|
||||
to [everyone who has contributed](https://github.com/code-rhapsodie/ezdataflow-bundle/graphs/contributors)
|
||||
already.
|
||||
|
||||
# License
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4||^8.0",
|
||||
"code-rhapsodie/dataflow-bundle": "^3.0",
|
||||
"code-rhapsodie/dataflow-bundle": "^3.0||^4.0",
|
||||
"http-interop/http-factory-guzzle": "^1.2",
|
||||
"ibexa/admin-ui": "^4.0",
|
||||
"ibexa/core": "^4.0"
|
||||
@@ -59,6 +59,9 @@
|
||||
"php-http/discovery": true
|
||||
}
|
||||
},
|
||||
"suggest": {
|
||||
"code-rhapsodie/ibexa-dataflow-bundle": "Use the new rebranded package."
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.x-dev",
|
||||
|
||||
4
sonar-project.properties
Normal file
4
sonar-project.properties
Normal file
@@ -0,0 +1,4 @@
|
||||
sonar.projectKey=code-rhapsodie_ezdataflow-bundle_AYvYuaBhWE9sbcQmD1vz
|
||||
|
||||
sonar.sources=src
|
||||
sonar.tests=tests
|
||||
@@ -91,7 +91,7 @@ class JobController extends Controller
|
||||
}
|
||||
|
||||
return new JsonResponse([
|
||||
'redirect' => $this->generateUrl('coderhapsodie.ezdataflow.main', ['_fragment' => 'oneshot'],
|
||||
'redirect' => $this->generateUrl('coderhapsodie.ezdataflow.main', ['_fragment' => 'ibexa-tab-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-oneshot'],
|
||||
UrlGeneratorInterface::ABSOLUTE_URL),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ namespace CodeRhapsodie\EzDataflowBundle\Filter;
|
||||
use CodeRhapsodie\EzDataflowBundle\Core\FieldComparator\FieldComparatorInterface;
|
||||
use CodeRhapsodie\EzDataflowBundle\Model\ContentUpdateStructure;
|
||||
use Ibexa\Contracts\Core\Repository\ContentService;
|
||||
use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException;
|
||||
use Psr\Log\LoggerAwareTrait;
|
||||
|
||||
/**
|
||||
@@ -37,7 +38,12 @@ class NotModifiedContentFilter
|
||||
if ($data->getId()) {
|
||||
$content = $this->contentService->loadContent($data->getId(), [$data->getLanguageCode()]);
|
||||
} else {
|
||||
$content = $this->contentService->loadContentByRemoteId($data->getRemoteId(), [$data->getLanguageCode()]);
|
||||
try {
|
||||
$content = $this->contentService->loadContentByRemoteId($data->getRemoteId(), [$data->getLanguageCode()]);
|
||||
} catch (NotFoundException $e) {
|
||||
// New translation
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($data->getFields() as $identifier => $hash) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
role.policy.ezdataflow: eZ Dataflow
|
||||
role.policy.ezdataflow.all_functions: eZ Dataflow / All functions
|
||||
role.policy.ezdataflow.view: eZ Dataflow / View
|
||||
role.policy.ezdataflow.edit: eZ Dataflow / Edit
|
||||
role.policy.ezdataflow: Ibexa Dataflow
|
||||
role.policy.ezdataflow.all_functions: Ibexa Dataflow / All functions
|
||||
role.policy.ezdataflow.view: Ibexa Dataflow / View
|
||||
role.policy.ezdataflow.edit: Ibexa Dataflow / Edit
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
role.policy.ezdataflow: eZ Dataflow
|
||||
role.policy.ezdataflow.all_functions: eZ Dataflow / Toutes les fonctions
|
||||
role.policy.ezdataflow.view: eZ Dataflow / Consultation
|
||||
role.policy.ezdataflow.edit: eZ Dataflow / Modification
|
||||
role.policy.ezdataflow: Ibexa Dataflow
|
||||
role.policy.ezdataflow.all_functions: Ibexa Dataflow / Toutes les fonctions
|
||||
role.policy.ezdataflow.view: Ibexa Dataflow / Consultation
|
||||
role.policy.ezdataflow.edit: Ibexa Dataflow / Modification
|
||||
|
||||
1
src/Resources/translations/ibexa_menu.en.yaml
Normal file
1
src/Resources/translations/ibexa_menu.en.yaml
Normal file
@@ -0,0 +1 @@
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
1
src/Resources/translations/ibexa_menu.fr.yaml
Normal file
1
src/Resources/translations/ibexa_menu.fr.yaml
Normal file
@@ -0,0 +1 @@
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
@@ -1 +1 @@
|
||||
coderhapsodie.ezdataflow: eZ Dataflow
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
|
||||
@@ -1 +1 @@
|
||||
coderhapsodie.ezdataflow: eZ Dataflow
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
coderhapsodie.ezdataflow: eZ Dataflow
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
coderhapsodie.ezdataflow.yes: Yes
|
||||
coderhapsodie.ezdataflow.no: No
|
||||
coderhapsodie.ezdataflow.repeating: Repeating
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
coderhapsodie.ezdataflow: eZ Dataflow
|
||||
coderhapsodie.ezdataflow: Ibexa Dataflow
|
||||
coderhapsodie.ezdataflow.yes: Oui
|
||||
coderhapsodie.ezdataflow.no: Non
|
||||
coderhapsodie.ezdataflow.repeating: Récurrent
|
||||
|
||||
@@ -71,22 +71,6 @@
|
||||
.closest('ul').querySelectorAll('li.ibexa-tabs__tab');
|
||||
const tabs = document.getElementById('ibexa-tab-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-repeating')
|
||||
.closest('.tab-content').querySelectorAll('.tab-pane');
|
||||
if (window.location.hash && window.location.hash === '#oneshot') {
|
||||
labels.forEach((link) => link.classList.remove('active'));
|
||||
tabs.forEach((tab) => tab.classList.remove('active'));
|
||||
document.getElementById('ibexa-tab-label-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-oneshot')
|
||||
.closest('li.ibexa-tabs__tab').classList.add('active');
|
||||
document.getElementById('ibexa-tab-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-oneshot')
|
||||
.closest('.tab-pane').classList.add('active');
|
||||
}
|
||||
if (window.location.hash && window.location.hash === '#history') {
|
||||
labels.forEach((link) => link.classList.remove('active'));
|
||||
tabs.forEach((tab) => tab.classList.remove('active'));
|
||||
document.getElementById('ibexa-tab-label-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-history')
|
||||
.closest('li.ibexa-tabs__tab').classList.add('active');
|
||||
document.getElementById('ibexa-tab-coderhapsodie-ezdataflow-code-rhapsodie-ezdataflow-history')
|
||||
.closest('.tab-pane').classList.add('active');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
.then((result) => {
|
||||
if (result.redirect) {
|
||||
window.location = result.redirect;
|
||||
window.location.reload();
|
||||
return;
|
||||
}
|
||||
const node = document.createElement('div');
|
||||
|
||||
Reference in New Issue
Block a user