├── .editorconfig ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── Bug-Report.yml │ ├── Feature-Request.yml │ ├── Improvement.yml │ └── config.yml ├── ci │ ├── files │ │ └── .env │ └── scripts │ │ └── setup-pimcore-environment.sh └── workflows │ ├── cla-check.yaml │ ├── docs.yaml │ ├── php-style.yml │ ├── poeditor-export.yml │ ├── stale.yml │ └── static-analysis.yml ├── .gitignore ├── .php-cs-fixer.cache ├── .php-cs-fixer.dist.php ├── LICENSE.md ├── README.md ├── SECURITY.md ├── composer.json ├── doc ├── 00_Installation.md ├── 01_Extending_Filters.md ├── 02_Exclude_Fields.md ├── 03_Upgrade_Notes.md ├── 04_Opensearch.md ├── 05_Elasticsearch.md └── img │ └── screen.jpg ├── phpstan-baseline.neon ├── phpstan-bootstrap.php ├── phpstan.neon └── src ├── AdvancedObjectSearchBundle.php ├── Command ├── ProcessUpdateQueueCommand.php ├── ReindexCommand.php ├── ServiceAwareCommand.php └── UpdateMappingCommand.php ├── Controller └── AdminController.php ├── DependencyInjection ├── AdvancedObjectSearchExtension.php └── Configuration.php ├── Enum └── ClientType.php ├── Event ├── AbstractFilterListener.php ├── AdvancedObjectSearchEvents.php ├── FilterListingEvent.php ├── FilterSearchEvent.php ├── SavedSearchEvent.php └── SavedSearchEvents.php ├── EventListener └── IndexUpdateListener.php ├── Factory └── OpenSearch │ └── LegacyServiceFactory.php ├── Filter ├── FieldDefinitionAdapter │ ├── AdvancedManyToManyObjectRelation.php │ ├── AdvancedManyToManyRelation.php │ ├── CalculatedValue.php │ ├── Checkbox.php │ ├── Country.php │ ├── Countrymultiselect.php │ ├── Date.php │ ├── Datetime.php │ ├── DefaultAdapter.php │ ├── FieldDefinitionAdapterInterface.php │ ├── Fieldcollections.php │ ├── Language.php │ ├── Languagemultiselect.php │ ├── Localizedfields.php │ ├── ManyToManyObjectRelation.php │ ├── ManyToManyRelation.php │ ├── ManyToOneRelation.php │ ├── Multiselect.php │ ├── Numeric.php │ ├── Objectbricks.php │ ├── QuantityValue.php │ ├── Select.php │ ├── Table.php │ ├── Time.php │ └── User.php ├── FieldSelectionInformation.php └── FilterEntry.php ├── Installer.php ├── Maintenance └── UpdateQueueProcessor.php ├── Messenger ├── QueueHandler.php └── QueueMessage.php ├── Migrations ├── PimcoreX │ ├── Version20210305134111.php │ └── Version20221130130306.php ├── Version20191218105114.php └── Version20210305134111.php ├── Model ├── SavedSearch.php └── SavedSearch │ ├── Dao.php │ ├── Listing.php │ └── Listing │ └── Dao.php ├── Resources ├── config │ ├── doctrine_migrations.yml │ ├── pimcore │ │ ├── config.yml │ │ └── routing.yml │ └── services.yml ├── public │ ├── css │ │ └── admin.css │ └── js │ │ ├── events.js │ │ ├── helper.js │ │ ├── portlet │ │ └── advancedObjectSearch.js │ │ ├── searchConfig │ │ ├── conditionAbstractPanel.js │ │ ├── conditionEntryPanel.js │ │ ├── conditionGroupPanel.js │ │ ├── conditionPanel.js │ │ ├── conditionPanelContainerBuilder.js │ │ ├── fieldConditionPanel │ │ │ ├── advancedManyToManyObjectRelation.js │ │ │ ├── advancedManyToManyRelation.js │ │ │ ├── checkbox.js │ │ │ ├── country.js │ │ │ ├── countrymultiselect.js │ │ │ ├── date.js │ │ │ ├── datetime.js │ │ │ ├── default.js │ │ │ ├── fieldcollections.js │ │ │ ├── language.js │ │ │ ├── languagemultiselect.js │ │ │ ├── localizedfields.js │ │ │ ├── manyToManyObjectRelation.js │ │ │ ├── manyToManyOne.js │ │ │ ├── manyToManyRelation.js │ │ │ ├── multiselect.js │ │ │ ├── numeric.js │ │ │ ├── objectbricks.js │ │ │ ├── quantityValue.js │ │ │ ├── select.js │ │ │ ├── table.js │ │ │ ├── time.js │ │ │ └── user.js │ │ ├── resultAbstractPanel.js │ │ ├── resultExtension.js │ │ └── resultPanel.js │ │ ├── searchConfigPanel.js │ │ ├── selector.js │ │ └── startup.js └── translations │ ├── admin.ca.yml │ ├── admin.cs.yml │ ├── admin.de.yml │ ├── admin.en.yml │ ├── admin.es.yml │ ├── admin.fr.yml │ ├── admin.hu.yml │ ├── admin.it.yml │ ├── admin.nl.yml │ ├── admin.pl.yml │ ├── admin.pt_br.yml │ ├── admin.ro.yml │ ├── admin.sk.yml │ ├── admin.sv.yml │ ├── admin.th.yml │ └── admin.zh_Hans.yml ├── Service.php └── Tools └── IndexConfigService.php /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 4 8 | 9 | [*.php] 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | 16 | [*.yml] 17 | indent_size = 4 18 | 19 | [composer.json] 20 | indent_style = space 21 | indent_size = 2 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | * -text -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Bug-Report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: [Bug] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Important notice 10 | As an open core project we love to work together with our community to improve and develop our products. 11 | It's also important for us to make clear that **we're not working for you or your company**, 12 | but we enjoy to work together to solve existing bugs. 13 | So we would love to see PRs with bugfixes, discuss them and we are happy to merge them when they are ready. 14 | For details see also our [contributing guidelines](https://github.com/pimcore/pimcore/blob/10.x/CONTRIBUTING.md). 15 | 16 | Bug reports that do not meet the conditions listed below will be closed/deleted without comment. 17 | 18 | - Bug was verified on the latest supported version. 19 | - This is not a security issue -> see [our security policy](https://github.com/pimcore/pimcore/security/policy) instead. 20 | - You are not able to provide a pull request that fixes the issue. 21 | - There's no existing ticket for the same issue. 22 | 23 | - type: textarea 24 | attributes: 25 | label: Expected behavior 26 | validations: 27 | required: true 28 | - type: textarea 29 | attributes: 30 | label: Actual behavior 31 | validations: 32 | required: true 33 | - type: textarea 34 | attributes: 35 | label: Steps to reproduce 36 | validations: 37 | required: true 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Feature-Request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Request or propose a new feature 3 | title: "[Feature]: " 4 | labels: ["New Feature"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Important notice 10 | As an open core project we love to work together with our community to improve and develop our products. 11 | It's also important for us to make clear that **we're not working for you or your company**, 12 | but we enjoy to work together to improve or add new features to the product. 13 | So we are always ready to discuss features and improvements with our community. 14 | Especially for bigger topics, please [start a discussion](https://github.com/pimcore/pimcore/discussions) first to aviod unnecessary efforts. 15 | 16 | As soon as a topic is more specific, feel free to create issues for it or even better provide a corresponding PR as we love to 17 | review and merge contributions. 18 | 19 | Feature requests that do not meet the conditions listed below will be closed/deleted without comment. 20 | - There's no existing ticket for the same topic 21 | - This is already a specific ready-to-work-on feature request 22 | 23 | - type: textarea 24 | attributes: 25 | label: Feature description 26 | validations: 27 | required: true 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/Improvement.yml: -------------------------------------------------------------------------------- 1 | name: Improvement 2 | description: Request or propose an improvement 3 | title: "[Improvement]: " 4 | labels: ["Improvement"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Important notice 10 | As an open core project we love to work together with our community to improve and develop our products. 11 | It's also important for us to make clear that **we're not working for you or your company**, 12 | but we enjoy to work together to improve or add new features to the product. 13 | So we are always ready to discuss features and improvements with our community. 14 | Especially for bigger topics, please [start a discussion](https://github.com/pimcore/pimcore/discussions) first to aviod unnecessary efforts. 15 | 16 | As soon as a topic is more specific, feel free to create issues for it or even better provide a corresponding PR as we love to 17 | review and merge contributions. 18 | 19 | Feature requests that do not meet the conditions listed below will be closed/deleted without comment. 20 | - There's no existing ticket for the same topic 21 | - This is already a specific ready-to-work-on feature request 22 | 23 | - type: textarea 24 | attributes: 25 | label: Improvement description 26 | validations: 27 | required: true 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: We are hiring! 4 | url: https://pimcore.com/en/careers?utm_source=github&utm_medium=issue-template-advanced-object-search&utm_campaign=careers 5 | about: Enjoy working with Pimcore? Join us on our mission! 6 | - name: Community Support 7 | url: https://github.com/pimcore/pimcore/discussions 8 | about: Please ask and answer questions here. 9 | -------------------------------------------------------------------------------- /.github/ci/files/.env: -------------------------------------------------------------------------------- 1 | APP_ENV=test 2 | -------------------------------------------------------------------------------- /.github/ci/scripts/setup-pimcore-environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu -o xtrace 4 | 5 | #cp -rv .github/ci/files/var . 6 | cp .github/ci/files/.env . 7 | -------------------------------------------------------------------------------- /.github/workflows/cla-check.yaml: -------------------------------------------------------------------------------- 1 | name: CLA check 2 | 3 | on: 4 | issue_comment: 5 | types: [created] 6 | pull_request_target: 7 | types: [opened, closed, synchronize] 8 | 9 | jobs: 10 | cla-workflow: 11 | uses: pimcore/workflows-collection-public/.github/workflows/reusable-cla-check.yaml@v1.3.0 12 | if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' 13 | secrets: 14 | CLA_ACTION_ACCESS_TOKEN: ${{ secrets.CLA_ACTION_ACCESS_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/docs.yaml: -------------------------------------------------------------------------------- 1 | 2 | name: "Documentation" 3 | 4 | on: 5 | pull_request_target: 6 | branches: 7 | - "[0-9]+.[0-9]+" 8 | - "[0-9]+.x" 9 | paths: 10 | - 'doc/**' 11 | - '.github/workflows/docs.yaml' 12 | - 'README.md' 13 | push: 14 | branches: 15 | - "[0-9]+.[0-9]+" 16 | - "[0-9]+.x" 17 | - "*_actions" 18 | paths: 19 | - 'doc/**' 20 | - '.github/workflows/docs.yaml' 21 | - 'README.md' 22 | 23 | permissions: 24 | contents: read 25 | 26 | jobs: 27 | docs: 28 | name: "Generate docs Pimcore Docs Generator" 29 | runs-on: "ubuntu-latest" 30 | steps: 31 | - name: "Checkout code" 32 | uses: "actions/checkout@v3" 33 | with: 34 | ref: ${{ github.event.pull_request.head.sha }} 35 | 36 | - name: "Checkout Docs Generator" 37 | uses: "actions/checkout@v3" 38 | with: 39 | repository: "pimcore/docs-generator" 40 | ref: "main" 41 | path: "./docs-generator" 42 | token: ${{ secrets.DOCS_GENERATOR_ACCESS_TOKEN }} 43 | 44 | - name: "Install Node" 45 | uses: actions/setup-node@v3 46 | with: 47 | node-version: 19.x 48 | registry-url: 'https://registry.npmjs.org' 49 | 50 | - name: Prepare Docs 51 | working-directory: "./docs-generator" 52 | run: | 53 | mkdir docs 54 | # copy docs to working directory 55 | cp -r ../doc ./docs/ 56 | 57 | # copy readme to working directory 58 | cp -r ../README.md ./docs/ 59 | 60 | # copy index page 61 | cp bin/resources/00_index_empty.md ./docs/00_index.md 62 | 63 | # use special docusaurus config (to exclude search plugin) and check for broken links 64 | mv docusaurus.config.js.repos-tests docusaurus.config.js 65 | 66 | - name: Build Docs 67 | working-directory: "./docs-generator" 68 | run: | 69 | npm install 70 | npm run build 71 | 72 | -------------------------------------------------------------------------------- /.github/workflows/php-style.yml: -------------------------------------------------------------------------------- 1 | name: "PHP-CS-Fixer" 2 | 3 | on: 4 | push: 5 | branches: 6 | - "[0-9]+.[0-9]+" 7 | - "[0-9]+.x" 8 | 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | php-style: 14 | uses: pimcore/workflows-collection-public/.github/workflows/reusable-php-cs-fixer.yaml@main 15 | if: github.repository_owner == 'pimcore' 16 | secrets: 17 | PHP_CS_FIXER_GITHUB_TOKEN: ${{ secrets.PHP_CS_FIXER_GITHUB_TOKEN }} 18 | with: 19 | head_ref: ${{ github.event.pull_request.head.ref }} 20 | repository: ${{ github.event.pull_request.head.repo.full_name }} 21 | config_file: .php-cs-fixer.dist.php 22 | -------------------------------------------------------------------------------- /.github/workflows/poeditor-export.yml: -------------------------------------------------------------------------------- 1 | name: "Trigger POEditor Translations Export" 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - "[0-9]+.x" 8 | paths: 9 | - 'src/Resources/translations/admin.en.yml' 10 | 11 | permissions: 12 | contents: read 13 | 14 | jobs: 15 | poeditor: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Trigger workflow in pimcore/poeditor-export-action 19 | env: 20 | GH_TOKEN: ${{ secrets.POEDITOR_ACTION_TRIGGER_TOKEN }} 21 | run: | 22 | gh workflow run -R pimcore/poeditor-export-action poeditor-export.yaml 23 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: Handle stale issues 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '37 7 * * *' 7 | 8 | jobs: 9 | call-stale-workflow: 10 | uses: pimcore/workflows-collection-public/.github/workflows/stale.yml@v1.1.0 11 | -------------------------------------------------------------------------------- /.github/workflows/static-analysis.yml: -------------------------------------------------------------------------------- 1 | name: "Static analysis centralised" 2 | 3 | on: 4 | schedule: 5 | - cron: '0 3 * * 1,3,5' 6 | workflow_dispatch: 7 | push: 8 | branches: 9 | - "[0-9]+.[0-9]+" 10 | - "[0-9]+.x" 11 | - "feature-*" 12 | pull_request: 13 | types: [ opened, synchronize, reopened ] 14 | 15 | 16 | env: 17 | PIMCORE_PROJECT_ROOT: ${{ github.workspace }} 18 | PRIVATE_REPO: ${{ github.event.repository.private }} 19 | 20 | jobs: 21 | setup-matrix: 22 | runs-on: ubuntu-latest 23 | outputs: 24 | php_versions: ${{ steps.parse-php-versions.outputs.php_versions }} 25 | matrix: ${{ steps.set-matrix.outputs.matrix }} 26 | private_repo: ${{ env.PRIVATE_REPO }} 27 | steps: 28 | - name: Checkout code 29 | uses: actions/checkout@v4 30 | 31 | - name: Checkout reusable workflow repo 32 | uses: actions/checkout@v4 33 | with: 34 | repository: pimcore/workflows-collection-public 35 | ref: main 36 | path: reusable-workflows 37 | 38 | - name: Parse PHP versions from composer.json 39 | id: parse-php-versions 40 | run: | 41 | if [ -f composer.json ]; then 42 | php_versions=$(jq -r '.require.php' composer.json | grep -oP '\d+\.\d+' | tr '\n' ',' | sed 's/,$//') 43 | if [ -z "$php_versions" ]; then 44 | echo "No PHP versions found in composer.json" 45 | echo "Setting default PHP value" 46 | echo "php_versions=default" >> $GITHUB_OUTPUT 47 | else 48 | echo "php_versions=$php_versions" >> $GITHUB_OUTPUT 49 | echo "#### php versions #### : $php_versions" 50 | fi 51 | else 52 | echo "composer.json not found" 53 | exit 1 54 | fi 55 | 56 | - name: Set up matrix 57 | id: set-matrix 58 | run: | 59 | php_versions="${{ steps.parse-php-versions.outputs.php_versions }}" 60 | 61 | MATRIX_JSON=$(cat reusable-workflows/phpstan-configuration/matrix-config.json) 62 | 63 | IFS=',' read -ra VERSIONS_ARRAY <<< "$php_versions" 64 | 65 | FILTERED_MATRIX_JSON=$(echo $MATRIX_JSON | jq --arg php_versions "$php_versions" ' 66 | { 67 | matrix: [ 68 | .configs[] | 69 | select(.php_version == $php_versions) | 70 | .matrix[] 71 | ] 72 | }') 73 | 74 | ENCODED_MATRIX_JSON=$(echo $FILTERED_MATRIX_JSON | jq -c .) 75 | 76 | echo "matrix=${ENCODED_MATRIX_JSON}" >> $GITHUB_OUTPUT 77 | 78 | static-analysis: 79 | needs: setup-matrix 80 | strategy: 81 | matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }} 82 | uses: pimcore/workflows-collection-public/.github/workflows/reusable-static-analysis-centralized.yaml@main 83 | with: 84 | APP_ENV: test 85 | PIMCORE_TEST: 1 86 | PRIVATE_REPO: ${{ needs.setup-matrix.outputs.private_repo}} 87 | PHP_VERSION: ${{ matrix.matrix.php-version }} 88 | SYMFONY: ${{ matrix.matrix.symfony }} 89 | DEPENDENCIES: ${{ matrix.matrix.dependencies }} 90 | EXPERIMENTAL: ${{ matrix.matrix.experimental }} 91 | PIMCORE_VERSION: ${{ matrix.matrix.pimcore_version }} 92 | COMPOSER_OPTIONS: ${{ matrix.matrix.composer_options }} 93 | secrets: 94 | SSH_PRIVATE_KEY_PIMCORE_DEPLOYMENTS_USER: ${{ secrets.SSH_PRIVATE_KEY_PIMCORE_DEPLOYMENTS_USER }} 95 | COMPOSER_PIMCORE_REPO_PACKAGIST_TOKEN: ${{ secrets.COMPOSER_PIMCORE_REPO_PACKAGIST_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | Thumbs.db 3 | *.log 4 | 5 | # symfony default 6 | /.web-server-pid 7 | /app/config/parameters.yml 8 | /build/ 9 | /phpunit.xml 10 | /web/bundles/ 11 | 12 | # local config 13 | !/app/config/local 14 | /app/config/local/* 15 | !app/config/local/.gitkeep 16 | 17 | # pimcore legacy (remove this for your own development) 18 | !/legacy 19 | /legacy/* 20 | !legacy/.gitkeep 21 | !legacy/bundle 22 | 23 | /var/* 24 | !/var/.gitkeep 25 | !/var/classes/ 26 | /var/classes/DataObject 27 | 28 | !/var/config 29 | /var/config/system.php 30 | /var/config/debug-mode.php 31 | /var/config/maintenance.php 32 | 33 | # project specific recommendations 34 | /var/config/tag-manager.php 35 | /var/config/reports.php 36 | 37 | 38 | /web/var/ 39 | 40 | # PHP-CS-Fixer 41 | /.php_cs 42 | /.php_cs.cache 43 | 44 | # composer 45 | /composer.lock 46 | !/vendor 47 | /vendor/* 48 | !/vendor/.gitkeep 49 | 50 | # PhpStorm / IDEA 51 | .idea 52 | .idea_modules 53 | # NetBeans 54 | nbproject 55 | 56 | node_modules/ 57 | 58 | # codeception (only stage *.dist.yml config files) 59 | /codeception.yml 60 | /pimcore/codeception.yml 61 | /pimcore/tests/*.suite.yml 62 | /pimcore/tests/_output/* 63 | /pimcore/tests/_support/_generated/* 64 | 65 | # keep legacy paths ignored for easier migration 66 | /plugins/ 67 | /tools/ 68 | /website/ 69 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | in([__DIR__ . '/src']) 5 | 6 | // do not fix views 7 | ->notName('*.html.php'); 8 | 9 | $config = new PhpCsFixer\Config(); 10 | $config->setRules([ 11 | '@PSR1' => true, 12 | '@PSR2' => true, 13 | 'array_syntax' => ['syntax' => 'short'], 14 | 15 | 'header_comment' => [ 16 | 'comment_type' => 'PHPDoc', 17 | 'header' => 18 | 'This source file is available under the terms of the' . PHP_EOL . 19 | 'Pimcore Open Core License (POCL)' . PHP_EOL . 20 | 'Full copyright and license information is available in' . PHP_EOL . 21 | 'LICENSE.md which is distributed with this source code.' . PHP_EOL . 22 | PHP_EOL . 23 | ' @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)' . PHP_EOL . 24 | ' @license Pimcore Open Core License (POCL)' 25 | ], 26 | 27 | 'blank_line_before_statement' => true, 28 | 'encoding' => true, 29 | 'function_typehint_space' => true, 30 | 'single_line_comment_style' => true, 31 | 'lowercase_cast' => true, 32 | 'magic_constant_casing' => true, 33 | 'method_argument_space' => ['on_multiline' => 'ignore'], 34 | 'native_function_casing' => true, 35 | 'no_blank_lines_after_class_opening' => true, 36 | 'no_blank_lines_after_phpdoc' => true, 37 | 'no_empty_comment' => true, 38 | 'no_empty_phpdoc' => true, 39 | 'no_empty_statement' => true, 40 | 'no_extra_blank_lines' => true, 41 | 'no_leading_import_slash' => true, 42 | 'no_leading_namespace_whitespace' => true, 43 | 'no_short_bool_cast' => true, 44 | 'no_spaces_around_offset' => true, 45 | 'no_unneeded_control_parentheses' => true, 46 | 'no_unused_imports' => true, 47 | 'no_whitespace_before_comma_in_array' => true, 48 | 'no_whitespace_in_blank_line' => true, 49 | 'object_operator_without_whitespace' => true, 50 | 'ordered_imports' => true, 51 | 'phpdoc_indent' => true, 52 | 'phpdoc_no_useless_inheritdoc' => true, 53 | 'phpdoc_scalar' => true, 54 | 'phpdoc_separation' => true, 55 | 'phpdoc_single_line_var_spacing' => true, 56 | 'return_type_declaration' => true, 57 | 'self_accessor' => true, 58 | 'short_scalar_cast' => true, 59 | 'single_blank_line_before_namespace' => true, 60 | 'single_quote' => true, 61 | 'space_after_semicolon' => true, 62 | 'standardize_not_equals' => true, 63 | 'ternary_operator_spaces' => true, 64 | 'whitespace_after_comma_in_array' => true, 65 | ]); 66 | 67 | $config->setFinder($finder); 68 | return $config; 69 | 70 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | If you think that you have found a security issue, 6 | don’t use the bug tracker and don’t publish it publicly. 7 | Instead, all security issues must be reported via a private vulnerability report. 8 | 9 | Please follow the [instructions](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability) to submit a private report. 10 | 11 | 12 | ## Resolving Process 13 | Every submitted security issue is handled with top priority by following these steps: 14 | 15 | 1. Confirm the vulnerability 16 | 2. Determine the severity 17 | 3. Contact reporter 18 | 4. Work on a patch 19 | 5. Get a CVE identification number (may be done by the reporter or a security service provider) 20 | 6. Patch reviewing 21 | 7. Tagging a new release for supported versions 22 | 8. Publish security announcement 23 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pimcore/advanced-object-search", 3 | "license": "proprietary", 4 | "type": "pimcore-bundle", 5 | "config": { 6 | "sort-packages": true 7 | }, 8 | "prefer-stable": true, 9 | "minimum-stability": "dev", 10 | "require": { 11 | "php": "~8.3.0 || ~8.4.0", 12 | "handcraftedinthealps/elasticsearch-dsl": "^8.0", 13 | "doctrine/dbal": "^3.2 || ^4.0", 14 | "pimcore/opensearch-client": "^2.0", 15 | "pimcore/elasticsearch-client": "^2.0", 16 | "pimcore/pimcore": "^12.0", 17 | "symfony/config": "^6.2", 18 | "symfony/console": "^6.2", 19 | "symfony/dependency-injection": "^6.2", 20 | "symfony/event-dispatcher": "^6.2", 21 | "symfony/http-foundation": "^6.3", 22 | "symfony/http-kernel": "^6.2", 23 | "symfony/messenger": "^6.2", 24 | "symfony/routing": "^6.2" 25 | }, 26 | "require-dev": { 27 | "phpstan/phpstan": "^1.12.15", 28 | "ergebnis/phpstan-rules": "^2.0" 29 | }, 30 | "autoload": { 31 | "psr-4": { 32 | "AdvancedObjectSearchBundle\\": "src/" 33 | } 34 | }, 35 | "extra": { 36 | "pimcore": { 37 | "bundles": [ 38 | "AdvancedObjectSearchBundle\\AdvancedObjectSearchBundle" 39 | ] 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /doc/00_Installation.md: -------------------------------------------------------------------------------- 1 | # Installation of Advanced Object Search 2 | 3 | :::info 4 | 5 | This bundle is only supported on Pimcore Core Framework 11. 6 | 7 | This bundle requires minimum version of OpenSearch 2.7. or Elasticsearch 8.0.0. 8 | 9 | ::: 10 | 11 | ## Installation 12 | 13 | To install Advanced Object Search Bundle, follow the three steps below: 14 | 15 | 1. Install the required dependencies: 16 | ```bash 17 | composer require pimcore/advanced-object-search 18 | ``` 19 | 20 | 2. Make sure the bundle is enabled in the `config/bundles.php` file. The following lines should be added: 21 | 22 | ```php 23 | 24 | return [ 25 | // ... 26 | AdvancedObjectSearchBundle\AdvancedObjectSearchBundle::class => ['all' => true], 27 | // ... 28 | ]; 29 | ``` 30 | 31 | 3. Install the bundle: 32 | 33 | ```bash 34 | bin/console pimcore:bundle:install AdvancedObjectSearchBundle 35 | ``` 36 | 37 | ## Required Backend User Permission 38 | To access the Advanced Object Search feature, a user needs to meet at least one of the following criteria: 39 | * Be an `admin` user. 40 | * Have `bundle_advancedsearch_search` permission. -------------------------------------------------------------------------------- /doc/02_Exclude_Fields.md: -------------------------------------------------------------------------------- 1 | # Exclude Fields 2 | 3 | It is possible to exclude specified fields from the search index by extending the services.yaml: 4 | ```yaml 5 | advanced_object_search: 6 | index_configuration: 7 | exclude_classes: 8 | - CustomerSegment 9 | - CustomerSegmentGroup 10 | exclude_fields: 11 | OfferToolOffer: 12 | - offernumber 13 | OfferToolOfferItem: 14 | - productName 15 | - productNumber 16 | ``` 17 | Please Note: Currently is not possible to exclude any specific field under a structured fieldset like `Object Bricks` and `Field collections`, but it is only possible to exclude the field entirely for a specific class. -------------------------------------------------------------------------------- /doc/03_Upgrade_Notes.md: -------------------------------------------------------------------------------- 1 | # Upgrade Notes 2 | 3 | ### Upgrade to v3.0.0 4 | - Reinstall of Bundle might be necessary - due to switch to MigrationInstaller. 5 | - Update ES mapping and reindex is necessary - run commands `advanced-object-search:update-mapping` and `advanced-object-search:re-index`. 6 | 7 | ### Upgrade to v4.0.0 8 | - Removed BC Layer for old configuration file. Configuration now only in symfony configuration tree. 9 | - Removed deprecated `IFieldDefinitionAdapter`, use `FieldDefinitionAdapterInterface` instead. 10 | - Data in Elasticsearch might be different, so recheck if you are depending directly on the data in Elasticsearch. 11 | - Execute all migrations of the bundle. 12 | 13 | #### Upgrade to Pimcore X 14 | - Update to latest (allowed) bundle version in Pimcore 6.9 and execute all migrations. 15 | - Make sure you are using ElasticSearch 7. 16 | - Then update to Pimcore X. 17 | 18 | ### Upgrade to v5.0.0 19 | - Removed Elasticsearch v6 and v7 support 20 | - Changed elasticsearch client configuration 21 | 22 | ### Upgrade to v6.0.0 23 | - Removed Pimcore 10 support 24 | - Removed Elasticsearch support and added OpenSearch support (Kept ONGR Elasticsearch library as it is compatible with OpenSearch) 25 | 26 | ### Upgrade to v6.1.0 27 | - Added support for Elasticsearch in parallel to Opensearch. Opensearch remains the default search technology. If you are using Elasticsearch, you need to update your symfony configuration as follows: 28 | ```yml 29 | advanced_object_search: 30 | client_name: default 31 | client_type: 'elasticsearch' 32 | ``` 33 | - Introduced new service alias `pimcore.advanced_object_search.search-client`. This will replace deprecated alias `pimcore.advanced_object_search.opensearch-client` which will be removed in the next major version. 34 | The new service alias can be used to inject the search client into your services. This search client is an instance of `Pimcore\SearchClient\SearchClientInterface` which is a common interface for OpenSearch and Elasticsearch clients. 35 | 36 | ### Upgrade to v6.2.0 37 | - Added support for `doctrine/dbal` `v4` 38 | -------------------------------------------------------------------------------- /doc/04_Opensearch.md: -------------------------------------------------------------------------------- 1 | # OpenSearch Client Setup 2 | 3 | :::info 4 | 5 | This bundle requires minimum version of OpenSearch 2.7. 6 | 7 | ::: 8 | 9 | Following configuration is required to set up OpenSearch. The OpenSearch client configuration takes place via [Pimcore Opensearch Client](https://github.com/pimcore/opensearch-client) and has two parts: 10 | 1) Configuring an OpenSearch client. 11 | 2) Define the client to be used by Advanced Object Search bundle. 12 | 13 | ```yaml 14 | # Configuring an OpenSearch client 15 | pimcore_open_search_client: 16 | clients: 17 | default: 18 | hosts: ['https://opensearch:9200'] 19 | password: 'admin' 20 | username: 'admin' 21 | ssl_verification: false 22 | 23 | 24 | # Define the client to be used by advanced object search 25 | advanced_object_search: 26 | client_name: default # default is default value here, just need to be specified when other client should be used. 27 | ``` 28 | 29 | If nothing is configured, a default client connecting to `localhost:9200` is used. 30 | 31 | For the further configuration of the client, please refer to the [Pimcore OpenSearch Client documentation](https://github.com/pimcore/opensearch-client/blob/1.x/doc/02_Configuration.md). -------------------------------------------------------------------------------- /doc/05_Elasticsearch.md: -------------------------------------------------------------------------------- 1 | # Elasticsearch Client Setup 2 | 3 | :::info 4 | 5 | This bundle requires minimum version of Elasticsearch 8.0. 6 | 7 | ::: 8 | 9 | Following configuration is required to set up Elasticsearch. The Elasticsearch client configuration takes place via [Pimcore Elasticsearch Client](https://github.com/pimcore/elasticsearch-client) and has two parts: 10 | 1) Configuring an Elasticsearch client. 11 | 2) Define the client to be used by Advanced Object Search bundle. 12 | 13 | ```yaml 14 | # Configuring an Elasticsearch client 15 | pimcore_elasticsearch_client: 16 | es_clients: 17 | default: 18 | hosts: ['elastic:9200'] 19 | username: 'elastic' 20 | password: 'somethingsecret' 21 | logger_channel: 'pimcore.elasicsearch' 22 | 23 | # Define the client to be used by advanced object search 24 | advanced_object_search: 25 | client_name: default # default is default value here, just need to be specified when other client should be used. 26 | client_type: 'elasticsearch' # default is 'openSearch' 27 | ``` 28 | 29 | If nothing is configured, a default client connecting to `localhost:9200` is used. 30 | 31 | For the further configuration of the client, please refer to the [Pimcore Elasticsearch Client documentation](https://github.com/pimcore/elasticsearch-client/blob/1.x/README.md). -------------------------------------------------------------------------------- /doc/img/screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pimcore/advanced-object-search/78cb4e160b3005181ce6ab2117a6235c367ca826/doc/img/screen.jpg -------------------------------------------------------------------------------- /phpstan-baseline.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | ignoreErrors: 3 | - 4 | message: "#^Class Pimcore\\\\Bundle\\\\SimpleBackendSearchBundle\\\\Installer not found.$#" 5 | reportUnmatched: false 6 | count: 1 7 | path: src/Installer.php 8 | 9 | - 10 | message: "#^Instantiated class Pimcore\\\\Bundle\\\\SimpleBackendSearchBundle\\\\PimcoreSimpleBackendSearchBundle not found.$#" 11 | reportUnmatched: false 12 | count: 1 13 | path: src/AdvancedObjectSearchBundle.php 14 | 15 | - 16 | message: "#^Class Pimcore\\\\Bundle\\\\SimpleBackendSearchBundle\\\\PimcoreSimpleBackendSearchBundle not found.$#" 17 | reportUnmatched: false 18 | count: 1 19 | path: src/AdvancedObjectSearchBundle.php -------------------------------------------------------------------------------- /phpstan-bootstrap.php: -------------------------------------------------------------------------------- 1 | setName('advanced-object-search:process-update-queue') 25 | ->setDescription('processes whole update queue of es search index') 26 | ; 27 | } 28 | 29 | protected function execute(InputInterface $input, OutputInterface $output): int 30 | { 31 | $count = 1; 32 | 33 | while ($count) { 34 | $count = $this->service->processUpdateQueue(); 35 | } 36 | 37 | return 0; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Command/ReindexCommand.php: -------------------------------------------------------------------------------- 1 | indexConfiguration = $indexConfiguration; 29 | parent::__construct(); 30 | } 31 | 32 | protected function configure(): void 33 | { 34 | $this 35 | ->setName('advanced-object-search:re-index') 36 | ->setDescription('Reindex all objects of given class. Does not delete index first or resets update queue.') 37 | ->addOption('classes', 'c', InputOption::VALUE_OPTIONAL, 'just update specific classes, use "," (comma) to execute more than one class') 38 | ; 39 | } 40 | 41 | protected function execute(InputInterface $input, OutputInterface $output): int 42 | { 43 | $classes = []; 44 | if ($input->getOption('classes')) { 45 | $classNames = explode(',', $input->getOption('classes')); 46 | foreach ($classNames as $name) { 47 | $classes[] = ClassDefinition::getByName($name); 48 | } 49 | } else { 50 | $classes = new ClassDefinition\Listing(); 51 | $classes->load(); 52 | $classes = $classes->getClasses(); 53 | } 54 | 55 | $classes = array_filter($classes); 56 | $elementsPerLoop = $this->indexConfiguration['elements_per_loop']; 57 | 58 | foreach ($classes as $class) { 59 | $listClassName = '\\Pimcore\\Model\\DataObject\\' . ucfirst($class->getName()) . '\\Listing'; 60 | $list = new $listClassName(); 61 | $list->setObjectTypes([AbstractObject::OBJECT_TYPE_OBJECT, AbstractObject::OBJECT_TYPE_VARIANT]); 62 | $list->setUnpublished(true); 63 | 64 | $elementsTotal = $list->getTotalCount(); 65 | 66 | for ($i = 0; $i < (ceil($elementsTotal / $elementsPerLoop)); $i++) { 67 | $list->setLimit($elementsPerLoop); 68 | $list->setOffset($i * $elementsPerLoop); 69 | 70 | $this->output->writeln('Processing ' . $class->getName() . ': ' . min($list->getOffset() + $elementsPerLoop, $elementsTotal) . '/' . $elementsTotal); 71 | 72 | $objects = $list->load(); 73 | foreach ($objects as $object) { 74 | try { 75 | $this->service->doUpdateIndexData($object, true); 76 | } catch (\Exception $e) { 77 | $this->writeError($e->getMessage()); 78 | } 79 | } 80 | \Pimcore::collectGarbage(); 81 | } 82 | } 83 | 84 | return 0; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/Command/ServiceAwareCommand.php: -------------------------------------------------------------------------------- 1 | service; 33 | } 34 | 35 | /** 36 | * @param Service $service 37 | */ 38 | #[Required] 39 | public function setService(Service $service): void 40 | { 41 | $this->service = $service; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Command/UpdateMappingCommand.php: -------------------------------------------------------------------------------- 1 | setName('advanced-object-search:update-mapping') 27 | ->setDescription('Deletes and recreates mapping of given classes. Resets update queue for given class.') 28 | ->addOption('classes', 'c', InputOption::VALUE_OPTIONAL, 'just update specific classes, use "," (comma) to execute more than one class') 29 | ; 30 | } 31 | 32 | protected function execute(InputInterface $input, OutputInterface $output): int 33 | { 34 | $classes = []; 35 | 36 | if ($input->getOption('classes')) { 37 | $classNames = explode(',', $input->getOption('classes')); 38 | foreach ($classNames as $name) { 39 | $classes[] = ClassDefinition::getByName($name); 40 | } 41 | } else { 42 | $classes = new ClassDefinition\Listing(); 43 | $classes->load(); 44 | $classes = $classes->getClasses(); 45 | } 46 | 47 | $classes = array_filter($classes); 48 | 49 | foreach ($classes as $class) { 50 | $indexName = $this->service->getIndexName($class->getName()); 51 | 52 | $this->output->writeln('Processing ' . $class->getName() . " -> index $indexName"); 53 | 54 | $this->service->updateMapping($class); 55 | } 56 | 57 | return 0; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/Enum/ClientType.php: -------------------------------------------------------------------------------- 1 | getCurrentRequest(); 36 | 37 | $this->service = $service; 38 | if ($request) { 39 | $this->parameters = new ParameterBag(json_decode($request->request->getString('customFilter'), true) ?: []); 40 | } else { 41 | $this->parameters = new ParameterBag([]); 42 | } 43 | } 44 | 45 | /** 46 | * @return ParameterBag 47 | */ 48 | protected function getParameters(): ParameterBag 49 | { 50 | return $this->parameters; 51 | } 52 | 53 | /** 54 | * @return Service 55 | */ 56 | protected function getService(): Service 57 | { 58 | return $this->service; 59 | } 60 | 61 | /** 62 | * {@inheritdoc} 63 | */ 64 | public static function getSubscribedEvents(): array 65 | { 66 | return [ 67 | AdvancedObjectSearchEvents::SEARCH_FILTER => [ 68 | ['onIndexSearch', 10], 69 | ], 70 | 71 | AdvancedObjectSearchEvents::LISTING_FILER => [ 72 | ['onListing', 10] 73 | ] 74 | ]; 75 | } 76 | 77 | public function onIndexSearch(FilterSearchEvent $event): void 78 | { 79 | if ($this->supports()) { 80 | $this->addIndexSearchFilter($event); 81 | } 82 | } 83 | 84 | public function onListing(FilterListingEvent $event): void 85 | { 86 | if ($this->supports()) { 87 | $this->addListingFiler($event); 88 | } 89 | } 90 | 91 | abstract protected function supports(): bool; 92 | 93 | protected function addIndexSearchFilter(FilterSearchEvent $event): void 94 | { 95 | } 96 | 97 | protected function addListingFiler(FilterListingEvent $event): void 98 | { 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/Event/AdvancedObjectSearchEvents.php: -------------------------------------------------------------------------------- 1 | listing = $listing; 29 | } 30 | 31 | /** 32 | * @return Listing 33 | */ 34 | public function getListing(): Listing 35 | { 36 | return $this->listing; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Event/FilterSearchEvent.php: -------------------------------------------------------------------------------- 1 | search = $search; 29 | } 30 | 31 | /** 32 | * @return Search 33 | */ 34 | public function getSearch(): Search 35 | { 36 | return $this->search; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Event/SavedSearchEvent.php: -------------------------------------------------------------------------------- 1 | search = $search; 29 | } 30 | 31 | /** 32 | * @return SavedSearch 33 | */ 34 | public function getSavedSearch(): SavedSearch 35 | { 36 | return $this->search; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Event/SavedSearchEvents.php: -------------------------------------------------------------------------------- 1 | service = $service; 33 | } 34 | 35 | public function updateObject(DataObjectEvent $event) 36 | { 37 | //do not update index when auto save or only saving version 38 | if ( 39 | ($event->hasArgument('isAutoSave') && $event->getArgument('isAutoSave')) || 40 | ($event->hasArgument('saveVersionOnly') && $event->getArgument('saveVersionOnly')) 41 | ) { 42 | return; 43 | } 44 | 45 | $inheritanceBackup = AbstractObject::getGetInheritedValues(); 46 | AbstractObject::setGetInheritedValues(true); 47 | 48 | $object = $event->getObject(); 49 | if ($object instanceof Concrete) { 50 | $this->service->doUpdateIndexData($object); 51 | } 52 | 53 | AbstractObject::setGetInheritedValues($inheritanceBackup); 54 | } 55 | 56 | public function deleteObject(DataObjectEvent $event) 57 | { 58 | $object = $event->getObject(); 59 | if ($object instanceof Concrete) { 60 | $this->service->doDeleteFromIndex($object); 61 | } 62 | } 63 | 64 | public function updateMapping(ClassDefinitionEvent $event) 65 | { 66 | $classDefinition = $event->getClassDefinition(); 67 | $this->service->updateMapping($classDefinition); 68 | } 69 | 70 | public function deleteIndex(ClassDefinitionEvent $event) 71 | { 72 | $classDefinition = $event->getClassDefinition(); 73 | 74 | try { 75 | $this->service->deleteIndex($classDefinition); 76 | } catch (\Exception $e) { 77 | Logger::err($e->getMessage()); 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/Factory/OpenSearch/LegacyServiceFactory.php: -------------------------------------------------------------------------------- 1 | client instanceof OpenSearchClientInterface => $this->client->getOriginalClient(), 52 | $this->client instanceof ElasticsearchClientInterface => ClientBuilder::create()->build(), 53 | default => null, 54 | }; 55 | 56 | if ($openSearchClient === null) { 57 | throw new RuntimeException('No client found for OpenSearch'); 58 | } 59 | 60 | $service = new Service( 61 | $this->logger, 62 | $this->userResolver, 63 | $filterLocator, 64 | $this->eventDispatcher, 65 | $this->translator, 66 | $this->indexConfigService, 67 | $openSearchClient 68 | ); 69 | 70 | $service->setSearchClientInterface($this->client); 71 | 72 | return $service; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/AdvancedManyToManyObjectRelation.php: -------------------------------------------------------------------------------- 1 | fieldDefinition->getName(); 29 | $value = $this->loadRawDataFromContainer($object, $name); 30 | 31 | return (string) $value; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/Checkbox.php: -------------------------------------------------------------------------------- 1 | considerInheritance) { 38 | return [ 39 | $this->fieldDefinition->getName(), 40 | [ 41 | 'properties' => [ 42 | self::INDEX_MAPPING_PROPERTY_STANDARD => [ 43 | 'type' => 'boolean', 44 | ], 45 | self::INDEX_MAPPING_PROPERTY_NOT_INHERITED => [ 46 | 'type' => 'boolean', 47 | ] 48 | ] 49 | ] 50 | ]; 51 | } 52 | 53 | return [ 54 | $this->fieldDefinition->getName(), 55 | [ 56 | 'type' => 'boolean', 57 | ] 58 | ]; 59 | } 60 | 61 | /** 62 | * @param Concrete $object 63 | * @param bool $ignoreInheritance 64 | */ 65 | protected function doGetIndexDataValue($object, $ignoreInheritance = false) 66 | { 67 | $inheritanceBackup = null; 68 | if ($ignoreInheritance) { 69 | $inheritanceBackup = AbstractObject::getGetInheritedValues(); 70 | AbstractObject::setGetInheritedValues(false); 71 | } 72 | 73 | $value = $this->loadRawDataFromContainer($object, $this->fieldDefinition->getName()); 74 | 75 | if ($ignoreInheritance) { 76 | AbstractObject::setGetInheritedValues($inheritanceBackup); 77 | } 78 | 79 | return (bool) $value; 80 | } 81 | 82 | /** 83 | * @param Concrete $object 84 | * 85 | * @return mixed 86 | */ 87 | public function getIndexData($object) 88 | { 89 | $value = $this->doGetIndexDataValue($object, false); 90 | 91 | if ($this->considerInheritance) { 92 | $notInheritedValue = $this->doGetIndexDataValue($object, true); 93 | 94 | $returnValue = []; 95 | $returnValue[self::INDEX_MAPPING_PROPERTY_STANDARD] = $value; 96 | $returnValue[self::INDEX_MAPPING_PROPERTY_NOT_INHERITED] = $notInheritedValue; 97 | 98 | return $returnValue; 99 | } else { 100 | return $value; 101 | } 102 | } 103 | 104 | /** 105 | * @param bool|string $fieldFilter 106 | * 107 | * filter field format as follows: 108 | * - simple boolean like 109 | * true | false --> creates QueryStringQuery 110 | * @param bool $ignoreInheritance 111 | * @param string $path 112 | * 113 | * @return BuilderInterface 114 | */ 115 | public function getQueryPart($fieldFilter, $ignoreInheritance = false, $path = '') 116 | { 117 | return new TermQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $fieldFilter); 118 | } 119 | 120 | /** 121 | * @inheritdoc 122 | */ 123 | public function getFieldSelectionInformation() 124 | { 125 | return [new FieldSelectionInformation( 126 | $this->fieldDefinition->getName(), 127 | $this->fieldDefinition->getTitle(), 128 | $this->fieldType, 129 | [ 130 | 'operators' => [BoolQuery::MUST, BoolQuery::MUST_NOT], 131 | 'classInheritanceEnabled' => $this->considerInheritance 132 | ] 133 | )]; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/Country.php: -------------------------------------------------------------------------------- 1 | considerInheritance) { 37 | return [ 38 | $this->fieldDefinition->getName(), 39 | [ 40 | 'properties' => [ 41 | self::INDEX_MAPPING_PROPERTY_STANDARD => [ 42 | 'type' => 'date', 43 | ], 44 | self::INDEX_MAPPING_PROPERTY_NOT_INHERITED => [ 45 | 'type' => 'date', 46 | ] 47 | ] 48 | ] 49 | ]; 50 | } else { 51 | return [ 52 | $this->fieldDefinition->getName(), 53 | [ 54 | 'type' => 'date', 55 | ] 56 | ]; 57 | } 58 | } 59 | 60 | /** 61 | * @param array|string $fieldFilter 62 | * 63 | * filter field format as follows: 64 | * - simple date like 65 | * 2017-02-26 --> creates TermQuery 66 | * - array with gt, gte, lt, lte like 67 | * ["gte" => 2017-02-26, "lte" => 2017-05-26] --> creates RangeQuery 68 | * @param bool $ignoreInheritance 69 | * @param string $path 70 | * 71 | * @return BuilderInterface 72 | */ 73 | public function getQueryPart($fieldFilter, $ignoreInheritance = false, $path = '') 74 | { 75 | if (is_array($fieldFilter)) { 76 | foreach ($fieldFilter as &$value) { 77 | $datetime = new \DateTime($value); 78 | $value = $datetime->format(\DateTimeInterface::ATOM); 79 | } 80 | 81 | return new RangeQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $fieldFilter); 82 | } else { 83 | $datetime = new \DateTime($fieldFilter); 84 | $datetime = $datetime->format(\DateTimeInterface::ATOM); 85 | 86 | return new TermQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $datetime); 87 | } 88 | } 89 | 90 | /** 91 | * @param Concrete $object 92 | * @param bool $ignoreInheritance 93 | */ 94 | protected function doGetIndexDataValue($object, $ignoreInheritance = false) 95 | { 96 | $inheritanceBackup = null; 97 | if ($ignoreInheritance) { 98 | $inheritanceBackup = AbstractObject::getGetInheritedValues(); 99 | AbstractObject::setGetInheritedValues(false); 100 | } 101 | 102 | $value = null; 103 | 104 | $getter = 'get' . $this->fieldDefinition->getName(); 105 | $valueObject = $object->$getter(); 106 | if ($valueObject) { 107 | $value = $valueObject->format(\DateTimeInterface::ATOM); 108 | } 109 | 110 | if ($ignoreInheritance) { 111 | AbstractObject::setGetInheritedValues($inheritanceBackup); 112 | } 113 | 114 | return $value; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/FieldDefinitionAdapterInterface.php: -------------------------------------------------------------------------------- 1 | fieldDefinition->getClasses() as $class) { 42 | $allowedClasses[] = $class['classes']; 43 | } 44 | 45 | return [new FieldSelectionInformation( 46 | $this->fieldDefinition->getName(), 47 | $this->fieldDefinition->getTitle(), 48 | $this->fieldType, 49 | [ 50 | 'operators' => [BoolQuery::MUST, BoolQuery::SHOULD, BoolQuery::MUST_NOT, FilterEntry::EXISTS, FilterEntry::NOT_EXISTS], 51 | 'allowedTypes' => $allowedTypes, 52 | 'allowedClasses' => $allowedClasses 53 | ] 54 | )]; 55 | } 56 | 57 | /** 58 | * @inheritDoc 59 | */ 60 | protected function doGetIndexDataValue($object, $ignoreInheritance = false) 61 | { 62 | $value = parent::doGetIndexDataValue($object, $ignoreInheritance); 63 | 64 | //rewrite all types to 'object' since 'variants' are not supported yet. 65 | $filteredValues = array_map(function ($item) { 66 | if (isset($item['element'])) { 67 | return [ 68 | 'id' => $item['element']['id'], 69 | 'type' => 'object' 70 | ]; 71 | } else { 72 | return [ 73 | 'id' => $item['id'], 74 | 'type' => 'object' 75 | ]; 76 | } 77 | }, $value); 78 | 79 | return $filteredValues; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/ManyToManyRelation.php: -------------------------------------------------------------------------------- 1 | considerInheritance) { 39 | return [ 40 | $this->fieldDefinition->getName(), 41 | [ 42 | 'properties' => [ 43 | self::INDEX_MAPPING_PROPERTY_STANDARD => [ 44 | 'type' => 'float', 45 | ], 46 | self::INDEX_MAPPING_PROPERTY_NOT_INHERITED => [ 47 | 'type' => 'float', 48 | ] 49 | ] 50 | ] 51 | ]; 52 | } else { 53 | return [ 54 | $this->fieldDefinition->getName(), 55 | [ 56 | 'type' => 'float', 57 | ] 58 | ]; 59 | } 60 | } 61 | 62 | /** 63 | * @param array|mixed $fieldFilter 64 | * 65 | * filter field format as follows: 66 | * - simple number like 67 | * 234.54 --> creates TermQuery 68 | * - array with gt, gte, lt, lte like 69 | * ["gte" => 40, "lte" => 45] --> creates RangeQuery 70 | * @param bool $ignoreInheritance 71 | * @param string $path 72 | * 73 | * @return BuilderInterface 74 | */ 75 | public function getQueryPart($fieldFilter, $ignoreInheritance = false, $path = '') 76 | { 77 | if (is_array($fieldFilter)) { 78 | return new RangeQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $fieldFilter); 79 | } else { 80 | return new TermQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $fieldFilter); 81 | } 82 | } 83 | 84 | /** 85 | * returns selectable fields with their type information for search frontend 86 | * 87 | * @return FieldSelectionInformation[] 88 | */ 89 | public function getFieldSelectionInformation() 90 | { 91 | return [new FieldSelectionInformation( 92 | $this->fieldDefinition->getName(), 93 | $this->fieldDefinition->getTitle(), 94 | $this->fieldType, 95 | [ 96 | 'operators' => ['lt', 'lte', 'eq', 'gte', 'gt', FilterEntry::EXISTS, FilterEntry::NOT_EXISTS ], 97 | 'classInheritanceEnabled' => $this->considerInheritance 98 | ] 99 | )]; 100 | } 101 | 102 | /** 103 | * @param Concrete $object 104 | * @param bool $ignoreInheritance 105 | */ 106 | protected function doGetIndexDataValue($object, $ignoreInheritance = false) 107 | { 108 | $inheritanceBackup = null; 109 | if ($ignoreInheritance) { 110 | $inheritanceBackup = AbstractObject::getGetInheritedValues(); 111 | AbstractObject::setGetInheritedValues(false); 112 | } 113 | 114 | $value = $this->loadRawDataFromContainer($object, $this->fieldDefinition->getName()); 115 | 116 | if ($ignoreInheritance) { 117 | AbstractObject::setGetInheritedValues($inheritanceBackup); 118 | } 119 | 120 | return $value; 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/Select.php: -------------------------------------------------------------------------------- 1 | considerInheritance) { 42 | return [ 43 | $this->fieldDefinition->getName(), 44 | [ 45 | 'properties' => [ 46 | self::INDEX_MAPPING_PROPERTY_STANDARD => ['type' => 'keyword'], 47 | self::INDEX_MAPPING_PROPERTY_NOT_INHERITED => ['type' => 'keyword'] 48 | ] 49 | ] 50 | ]; 51 | } else { 52 | return [ 53 | $this->fieldDefinition->getName(), 54 | [ 55 | 'type' => 'keyword', 56 | ] 57 | ]; 58 | } 59 | } 60 | 61 | /** 62 | * @param Concrete $object 63 | * @param bool $ignoreInheritance 64 | */ 65 | protected function doGetIndexDataValue($object, $ignoreInheritance = false) 66 | { 67 | $inheritanceBackup = null; 68 | if ($ignoreInheritance) { 69 | $inheritanceBackup = AbstractObject::getGetInheritedValues(); 70 | AbstractObject::setGetInheritedValues(false); 71 | } 72 | 73 | $value = $this->loadRawDataFromContainer($object, $this->fieldDefinition->getName()); 74 | 75 | if ($ignoreInheritance) { 76 | AbstractObject::setGetInheritedValues($inheritanceBackup); 77 | } 78 | 79 | return $value; 80 | } 81 | 82 | /** 83 | * @param string $fieldFilter 84 | * 85 | * filter field format as follows: 86 | * - simple string like 87 | * "filter for value" --> creates QueryStringQuery 88 | * @param bool $ignoreInheritance 89 | * @param string $path 90 | * 91 | * @return BuilderInterface 92 | */ 93 | public function getQueryPart($fieldFilter, $ignoreInheritance = false, $path = '') 94 | { 95 | return new TermQuery($path . $this->fieldDefinition->getName() . $this->buildQueryFieldPostfix($ignoreInheritance), $fieldFilter); 96 | } 97 | 98 | /** 99 | * @inheritdoc 100 | */ 101 | public function getFieldSelectionInformation() 102 | { 103 | return [new FieldSelectionInformation( 104 | $this->fieldDefinition->getName(), 105 | $this->fieldDefinition->getTitle(), 106 | $this->fieldType, 107 | [ 108 | 'operators' => [BoolQuery::MUST, BoolQuery::SHOULD, BoolQuery::MUST_NOT, FilterEntry::EXISTS, FilterEntry::NOT_EXISTS], 109 | 'classInheritanceEnabled' => $this->considerInheritance, 110 | 'options' => $this->fieldDefinition->getOptions() 111 | ] 112 | )]; 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/Time.php: -------------------------------------------------------------------------------- 1 | fieldDefinition->getName(); 43 | $valueObject = $object->$getter(); 44 | if ($valueObject) { 45 | $valueObject = new \DateTime('0000-01-01T' . $valueObject); 46 | $value = $valueObject->format(\DateTimeInterface::ATOM); 47 | } 48 | 49 | if ($ignoreInheritance) { 50 | AbstractObject::setGetInheritedValues($inheritanceBackup); 51 | } 52 | 53 | return $value; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Filter/FieldDefinitionAdapter/User.php: -------------------------------------------------------------------------------- 1 | fieldName = $fieldName; 46 | $this->fieldLabel = $fieldLabel; 47 | $this->fieldType = $fieldType; 48 | $this->context = $context; 49 | } 50 | 51 | /** 52 | * @return string 53 | */ 54 | public function getFieldName() 55 | { 56 | return $this->fieldName; 57 | } 58 | 59 | /** 60 | * @param string $fieldName 61 | */ 62 | public function setFieldName($fieldName) 63 | { 64 | $this->fieldName = $fieldName; 65 | } 66 | 67 | /** 68 | * @return string 69 | */ 70 | public function getFieldLabel() 71 | { 72 | return $this->fieldLabel; 73 | } 74 | 75 | /** 76 | * @param string $fieldLabel 77 | */ 78 | public function setFieldLabel($fieldLabel) 79 | { 80 | $this->fieldLabel = $fieldLabel; 81 | } 82 | 83 | /** 84 | * @return string 85 | */ 86 | public function getFieldType() 87 | { 88 | return $this->fieldType; 89 | } 90 | 91 | /** 92 | * @param string $fieldType 93 | */ 94 | public function setFieldType($fieldType) 95 | { 96 | $this->fieldType = $fieldType; 97 | } 98 | 99 | /** 100 | * @return array 101 | */ 102 | public function getContext() 103 | { 104 | return $this->context; 105 | } 106 | 107 | /** 108 | * @param array $context 109 | */ 110 | public function setContext($context) 111 | { 112 | $this->context = $context; 113 | } 114 | 115 | public function toArray() 116 | { 117 | return [ 118 | 'fieldName' => $this->fieldName, 119 | 'fieldLabel' => $this->fieldLabel, 120 | 'fieldType' => $this->fieldType, 121 | 'context' => $this->context 122 | ]; 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/Filter/FilterEntry.php: -------------------------------------------------------------------------------- 1 | operator = $operator; 67 | } 68 | $this->fieldname = $fieldname; 69 | $this->filterEntryData = $filterEntryData; 70 | $this->ignoreInheritance = $ignoreInheritance; 71 | } 72 | 73 | /** 74 | * @return string 75 | */ 76 | public function getOperator() 77 | { 78 | return $this->operator; 79 | } 80 | 81 | public function getOuterOperator() 82 | { 83 | if ($this->operator == self::EXISTS) { 84 | return BoolQuery::MUST; 85 | } elseif ($this->operator == self::NOT_EXISTS) { 86 | return BoolQuery::MUST_NOT; 87 | } else { 88 | return $this->operator; 89 | } 90 | } 91 | 92 | /** 93 | * @param string $operator 94 | */ 95 | public function setOperator($operator) 96 | { 97 | $this->operator = $operator; 98 | } 99 | 100 | /** 101 | * @return string 102 | */ 103 | public function getFieldname() 104 | { 105 | return $this->fieldname; 106 | } 107 | 108 | /** 109 | * @param string $fieldname 110 | */ 111 | public function setFieldname($fieldname) 112 | { 113 | $this->fieldname = $fieldname; 114 | } 115 | 116 | /** 117 | * @return \stdClass | BuilderInterface | string | array 118 | */ 119 | public function getFilterEntryData() 120 | { 121 | return $this->filterEntryData; 122 | } 123 | 124 | /** 125 | * @param \stdClass | BuilderInterface | string | array $filterEntryData 126 | */ 127 | public function setFilterEntryData($filterEntryData) 128 | { 129 | $this->filterEntryData = $filterEntryData; 130 | } 131 | 132 | /** 133 | * @return bool 134 | */ 135 | public function isGroup() 136 | { 137 | return $this->fieldname == self::FIELDNAME_GROUP; 138 | } 139 | 140 | /** 141 | * @return bool 142 | */ 143 | public function getIgnoreInheritance() 144 | { 145 | return $this->ignoreInheritance; 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /src/Maintenance/UpdateQueueProcessor.php: -------------------------------------------------------------------------------- 1 | service = $service; 45 | $this->messengerQueueActivated = $messengerQueueActivated; 46 | $this->queueHandler = $queueHandler; 47 | } 48 | 49 | public function execute(): void 50 | { 51 | if ($this->messengerQueueActivated) { 52 | $this->queueHandler->dispatchMessages(); 53 | } else { 54 | $this->service->processUpdateQueue(500); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Messenger/QueueHandler.php: -------------------------------------------------------------------------------- 1 | queueService = $queueService; 33 | $this->messageBus = $messageBus; 34 | $this->workerCountLifeTime = $workerCountLifeTime; 35 | $this->workerItemCount = $workerItemCount; 36 | $this->workerCount = $workerCount; 37 | } 38 | 39 | public function __invoke(QueueMessage $message) 40 | { 41 | $this->queueService->doProcessUpdateQueue($message->getWorkerId(), $message->getEntries()); 42 | 43 | $this->removeMessage($message->getWorkerId()); 44 | $this->dispatchMessages(); 45 | } 46 | 47 | public function dispatchMessages() 48 | { 49 | $dispatchedMessageCount = $this->getMessageCount(); 50 | 51 | $addWorkers = true; 52 | while ($addWorkers && $dispatchedMessageCount < $this->workerCount) { 53 | $workerId = uniqid(); 54 | $entries = $this->queueService->initUpdateQueue($workerId, $this->workerItemCount); 55 | if (!empty($entries)) { 56 | $this->addMessage($workerId); 57 | $this->messageBus->dispatch(new QueueMessage($workerId, $entries)); 58 | $dispatchedMessageCount = $this->getMessageCount(); 59 | } else { 60 | $addWorkers = false; 61 | } 62 | } 63 | } 64 | 65 | private function addMessage(string $messageId) 66 | { 67 | TmpStore::set(self::IMPORTER_WORKER_COUNT_TMP_STORE_KEY . $messageId, true, self::IMPORTER_WORKER_COUNT_TMP_STORE_KEY, $this->workerCountLifeTime); 68 | } 69 | 70 | private function removeMessage(string $messageId) 71 | { 72 | TmpStore::delete(self::IMPORTER_WORKER_COUNT_TMP_STORE_KEY . $messageId); 73 | } 74 | 75 | private function getMessageCount(): int 76 | { 77 | $ids = TmpStore::getIdsByTag(self::IMPORTER_WORKER_COUNT_TMP_STORE_KEY); 78 | $runningWorkers = []; 79 | foreach ($ids as $id) { 80 | $runningWorkers[] = TmpStore::get($id); 81 | } 82 | 83 | return count(array_filter($runningWorkers)); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/Messenger/QueueMessage.php: -------------------------------------------------------------------------------- 1 | workerId = $workerId; 28 | $this->entries = $entries; 29 | } 30 | 31 | /** 32 | * @return string 33 | */ 34 | public function getWorkerId(): string 35 | { 36 | return $this->workerId; 37 | } 38 | 39 | /** 40 | * @return array 41 | */ 42 | public function getEntries(): array 43 | { 44 | return $this->entries; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Migrations/PimcoreX/Version20210305134111.php: -------------------------------------------------------------------------------- 1 | getTable(Installer::QUEUE_TABLE_NAME); 36 | if ($table->hasColumn('o_id')) { 37 | $query = 'ALTER TABLE %s CHANGE COLUMN `o_id` `id` bigint DEFAULT 0 NOT NULL;'; 38 | $this->addSql(sprintf($query, $table->getName())); 39 | } 40 | } 41 | 42 | public function down(Schema $schema): void 43 | { 44 | $table = $schema->getTable(Installer::QUEUE_TABLE_NAME); 45 | if ($table->hasColumn('id')) { 46 | $query = 'ALTER TABLE %s CHANGE COLUMN `id` `o_id` bigint DEFAULT 0 NOT NULL;'; 47 | $this->addSql(sprintf($query, $table->getName())); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/Migrations/Version20191218105114.php: -------------------------------------------------------------------------------- 1 | getTable(SavedSearch\Dao::TABLE_NAME); 28 | $execTable->addColumn('shareGlobally', 'boolean', ['default' => null, 'notnull' => false]); 29 | $execTable->addIndex(['shareGlobally'], 'shareGlobally'); 30 | } 31 | 32 | /** 33 | * @param Schema $schema 34 | */ 35 | public function down(Schema $schema) 36 | { 37 | $execTable = $schema->getTable(SavedSearch\Dao::TABLE_NAME); 38 | $execTable->dropColumn('shareGlobally'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Migrations/Version20210305134111.php: -------------------------------------------------------------------------------- 1 | fetchAssociative( 40 | 'SELECT * FROM pimcore_migrations WHERE migration_set = ? AND version = ?', 41 | ['AdvancedObjectSearchBundle', '00000001'] 42 | ); 43 | 44 | if ($entry && !empty($entry['migrated_at'])) { 45 | SettingsStore::set('BUNDLE_INSTALLED__AdvancedObjectSearchBundle\\AdvancedObjectSearchBundle', true, 'bool', 'pimcore'); 46 | } 47 | } 48 | 49 | /** 50 | * @param Schema $schema 51 | */ 52 | public function down(Schema $schema) 53 | { 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/Model/SavedSearch/Dao.php: -------------------------------------------------------------------------------- 1 | db->fetchAssociative('SELECT * FROM ' . $this->db->quoteIdentifier(self::TABLE_NAME) . ' WHERE id = ?', [$id]); 35 | if (!$data['id']) { 36 | throw new \Exception('SavedSearch item with id ' . $id . ' not found'); 37 | } 38 | $this->assignVariablesToModel($data); 39 | } 40 | 41 | /** 42 | * Save object to database 43 | * 44 | * @return bool 45 | */ 46 | public function save() 47 | { 48 | $this->db->beginTransaction(); 49 | 50 | try { 51 | $dataAttributes = get_object_vars($this->model); 52 | 53 | $data = []; 54 | foreach ($dataAttributes as $key => $value) { 55 | if (in_array($key, $this->getValidTableColumns(self::TABLE_NAME))) { 56 | if (in_array($key, ['sharedUserIds', 'shortCutUserIds'])) { 57 | // sharedUserIds and shortCustUserIds are stored as csv 58 | if (is_array($value)) { 59 | $value = ',' . implode(',', $value) . ','; 60 | } 61 | } 62 | $data[$key] = $value; 63 | } 64 | } 65 | 66 | $lastInsertId = Helper::upsert($this->db, self::TABLE_NAME, $data, $this->getPrimaryKey(self::TABLE_NAME)); 67 | if ($lastInsertId !== null && !$this->model->getId()) { 68 | $this->model->setId((int) $lastInsertId); 69 | } 70 | 71 | $this->db->commit(); 72 | 73 | return true; 74 | } catch (\Exception $e) { 75 | $this->db->rollBack(); 76 | 77 | throw $e; 78 | } 79 | } 80 | 81 | /** 82 | * Deletes object from database 83 | * 84 | * @return void 85 | */ 86 | public function delete() 87 | { 88 | $this->db->beginTransaction(); 89 | 90 | try { 91 | $this->db->delete(self::TABLE_NAME, ['id' => $this->model->getId()]); 92 | 93 | $this->db->commit(); 94 | } catch (\Exception $e) { 95 | $this->db->rollBack(); 96 | 97 | throw $e; 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/Model/SavedSearch/Listing.php: -------------------------------------------------------------------------------- 1 | savedSearches = $savedSearches; 50 | 51 | return $this; 52 | } 53 | 54 | /** 55 | * @return array 56 | */ 57 | public function getSavedSearches() 58 | { 59 | return $this->savedSearches; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/Model/SavedSearch/Listing/Dao.php: -------------------------------------------------------------------------------- 1 | db->fetchFirstColumn('SELECT id FROM ' . $this->db->quoteIdentifier(SavedSearch\Dao::TABLE_NAME) . ' ' . $this->getCondition() . $this->getOrder() . $this->getOffsetLimit(), $this->model->getConditionVariables()); 35 | 36 | $searches = []; 37 | foreach ($searchIds as $id) { 38 | if ($savedSearch = SavedSearch::getById($id)) { 39 | $searches[] = $savedSearch; 40 | } 41 | } 42 | 43 | $this->model->setSavedSearches($searches); 44 | 45 | return $searches; 46 | } 47 | 48 | /** 49 | * @throws Exception 50 | */ 51 | public function loadIdList() 52 | { 53 | return $this->db->fetchFirstColumn('SELECT id FROM ' . $this->db->quoteIdentifier(SavedSearch\Dao::TABLE_NAME) . ' ' . $this->getCondition() . $this->getGroupBy() . $this->getOrder() . $this->getOffsetLimit(), $this->model->getConditionVariables()); 54 | } 55 | 56 | public function getTotalCount(): int 57 | { 58 | $amount = 0; 59 | 60 | try { 61 | $amount = (int) $this->db->fetchOne('SELECT COUNT(*) as amount FROM ' . $this->db->quoteIdentifier(SavedSearch\Dao::TABLE_NAME) . ' ' . $this->getCondition(), $this->model->getConditionVariables()); 62 | } catch (\Exception $e) { 63 | } 64 | 65 | return $amount; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/Resources/config/doctrine_migrations.yml: -------------------------------------------------------------------------------- 1 | doctrine_migrations: 2 | migrations_paths: 3 | 'AdvancedObjectSearchBundle\Migrations\PimcoreX': '@AdvancedObjectSearchBundle/Migrations/PimcoreX' 4 | -------------------------------------------------------------------------------- /src/Resources/config/pimcore/routing.yml: -------------------------------------------------------------------------------- 1 | _pimcore_advancedobjectsearch_backend: 2 | resource: "@AdvancedObjectSearchBundle/Controller/" 3 | type: attribute 4 | prefix: /admin/bundle/advanced-object-search 5 | -------------------------------------------------------------------------------- /src/Resources/public/css/admin.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | .pimcore_bundle_advancedObjectSearch_saveAndShare { 13 | background: url("/bundles/pimcoreadmin/img/flat-color-icons/collaboration.svg") center center no-repeat !important; 14 | } 15 | 16 | .pimcore_bundle_advancedObjectSearch_grid { 17 | background: url("/bundles/pimcoreadmin/img/flat-color-icons/grid.svg") center center no-repeat !important; 18 | } 19 | 20 | .pimcore_bundle_advancedObjectSearch_filter { 21 | background: url("/bundles/pimcoreadmin/img/flat-color-icons/filled_filter.svg") center center no-repeat !important; 22 | } 23 | 24 | .pimcore_bundle_advancedObjectSearch { 25 | background: url("/bundles/pimcoreadmin/img/flat-color-icons/binoculars.svg") center center no-repeat !important; 26 | } 27 | 28 | .pimcore_bundle_nav_icon_advancedObjectSearch { 29 | background: url("/bundles/pimcoreadmin/img/flat-white-icons/binoculars.svg") center center no-repeat !important; 30 | } 31 | 32 | #pimcore_bundle_advancedObjectSearch_toolbar { 33 | background-image: url(/bundles/pimcoreadmin/img/flat-color-icons/binoculars.svg) !important; 34 | filter: grayscale(0%) !important; 35 | -webkit-filter: grayscale(0%) !important; 36 | position: relative; 37 | } 38 | 39 | #pimcore_bundle_advancedObjectSearch_toolbar:before { 40 | position: absolute; 41 | width: 12px; 42 | height: 12px; 43 | bottom: 0px; 44 | right: 5px; 45 | content: ""; 46 | background: url(/bundles/pimcoreadmin/img/flat-color-icons/settings.svg) center center no-repeat !important; 47 | } 48 | -------------------------------------------------------------------------------- /src/Resources/public/js/events.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | /** 12 | * on search result initialize 13 | * extensionBag is passed as parameters 14 | */ 15 | pimcore.events.onAdvancedObjectSearchResult = "pimcore.advancedObjectSearch.result.initialize"; 16 | 17 | pimcore.events.onAdvancedObjectSearchResultRowContextMenu = "pimcore.advancedObjectSearch.result.onRowContextMenu"; 18 | 19 | //TODO: delete once support for Pimcore 10.6 is dropped 20 | 21 | if(typeof addEventListenerCompatibilityForPlugins === "function") { 22 | let eventMappings = []; 23 | eventMappings["onAdvancedObjectSearchResult"] = pimcore.events.onAdvancedObjectSearchResult; 24 | addEventListenerCompatibilityForPlugins(eventMappings); 25 | console.warn("Deprecation: addEventListenerCompatibilityForPlugins will be not supported in Pimcore 11."); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/Resources/public/js/portlet/advancedObjectSearch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.layout.portlets.advancedObjectSearch"); 13 | pimcore.layout.portlets.advancedObjectSearch = Class.create(pimcore.layout.portlets.abstract, { 14 | 15 | getType: function () { 16 | return "pimcore.layout.portlets.advancedObjectSearch"; 17 | }, 18 | 19 | 20 | getName: function () { 21 | return t("bundle_advancedObjectSearch"); 22 | }, 23 | 24 | getIcon: function () { 25 | return "pimcore_bundle_advancedObjectSearch"; 26 | }, 27 | 28 | getLayout: function (portletId) { 29 | 30 | var defaultConf = this.getDefaultConfig(); 31 | 32 | 33 | 34 | defaultConf.tools = [ 35 | { 36 | type:'search', 37 | handler: function() { 38 | pimcore.bundle.advancedObjectSearch.helper.openEsSearch(this.config); 39 | }.bind(this) 40 | }, 41 | { 42 | type:'gear', 43 | handler: this.editSettings.bind(this) 44 | }, 45 | { 46 | type:'close', 47 | handler: this.remove.bind(this) 48 | } 49 | ]; 50 | 51 | this.layout = Ext.create('Portal.view.Portlet', Object.assign(defaultConf, { 52 | title: this.getName(), 53 | iconCls: this.getIcon(), 54 | height: 275, 55 | layout: "fit", 56 | items: [] 57 | })); 58 | 59 | if(this.config) { 60 | this.updateChart(); 61 | } 62 | 63 | this.layout.portletId = portletId; 64 | return this.layout; 65 | }, 66 | 67 | editSettings: function () { 68 | var selector = new pimcore.bundle.advancedObjectSearch.selector(this.updateSettings.bind(this)); 69 | }, 70 | 71 | updateSettings: function(searchId, callback) { 72 | 73 | this.config = searchId; 74 | Ext.Ajax.request({ 75 | url: "/admin/portal/update-portlet-config", 76 | method: 'PUT', 77 | params: { 78 | key: this.portal.key, 79 | id: this.layout.portletId, 80 | config: this.config 81 | }, 82 | success: function () { 83 | this.updateChart(); 84 | callback(); 85 | }.bind(this) 86 | }); 87 | }, 88 | 89 | updateChart: function() { 90 | if(this.config) { 91 | Ext.Ajax.request({ 92 | url: "/admin/bundle/advanced-object-search/admin/load-search", 93 | params: { 94 | id: this.config 95 | }, 96 | method: "get", 97 | success: function (response) { 98 | var searchConfig = Ext.decode(response.responseText); 99 | var resultPanel = new pimcore.bundle.advancedObjectSearch.searchConfig.resultPanel( 100 | function() { 101 | return response.responseText; 102 | }, 103 | searchConfig.gridConfig, 104 | true 105 | ); 106 | var resultPanelLayout = resultPanel.getLayout(); 107 | resultPanel.updateGrid(searchConfig.classId); 108 | this.layout.removeAll(); 109 | this.layout.add(resultPanelLayout); 110 | this.layout.updateLayout(); 111 | 112 | }.bind(this) 113 | }); 114 | 115 | 116 | } 117 | } 118 | 119 | }); 120 | -------------------------------------------------------------------------------- /src/Resources/public/js/searchConfig/conditionAbstractPanel.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch.searchConfig.conditionAbstractPanel"); 13 | pimcore.bundle.advancedObjectSearch.searchConfig.conditionAbstractPanel = Class.create({ 14 | 15 | fieldCondition: null, 16 | fieldConditionPanel: null, 17 | mainPanelLayout: "hbox", 18 | classId: null, 19 | 20 | initialize: function(classId, mainPanelLayout) { 21 | this.classId = classId; 22 | if(mainPanelLayout) { 23 | this.mainPanelLayout = mainPanelLayout; 24 | } 25 | 26 | }, 27 | 28 | getTopBar: function (name, index, parent) { 29 | return [{ 30 | xtype: "tbtext", 31 | text: "" + name + "" 32 | },"-",{ 33 | iconCls: "pimcore_icon_up", 34 | handler: function (blockId, parent) { 35 | 36 | var container = parent.conditionsContainerInner; 37 | var blockElement = Ext.getCmp(blockId); 38 | var index = this.detectBlockIndex(blockElement, container); 39 | 40 | var newIndex = index-1; 41 | if(newIndex < 0) { 42 | newIndex = 0; 43 | } 44 | 45 | container.remove(blockElement, false); 46 | container.insert(newIndex, blockElement); 47 | 48 | pimcore.layout.refresh(); 49 | }.bind(this, index, parent) 50 | },{ 51 | iconCls: "pimcore_icon_down", 52 | handler: function (blockId, parent) { 53 | var container = parent.conditionsContainerInner; 54 | var blockElement = Ext.getCmp(blockId); 55 | var index = this.detectBlockIndex(blockElement, container); 56 | 57 | container.remove(blockElement, false); 58 | container.insert(index+1, blockElement); 59 | 60 | pimcore.layout.refresh(); 61 | }.bind(this, index, parent) 62 | },"->",{ 63 | iconCls: "pimcore_icon_delete", 64 | handler: function (index, parent) { 65 | parent.conditionsContainerInner.remove(Ext.getCmp(index)); 66 | }.bind(window, index, parent) 67 | }]; 68 | }, 69 | 70 | detectBlockIndex: function (blockElement, container) { 71 | // detect index 72 | var index; 73 | 74 | for(var s=0; s < container.items.items.length; s++) { 75 | if(container.items.items[s].getId() == blockElement.getId()) { 76 | index = s; 77 | break; 78 | } 79 | } 80 | return index; 81 | } 82 | }); 83 | -------------------------------------------------------------------------------- /src/Resources/public/js/searchConfig/conditionGroupPanel.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch.searchConfig.conditionGroupPanel"); 13 | pimcore.bundle.advancedObjectSearch.searchConfig.conditionGroupPanel = Class.create(pimcore.bundle.advancedObjectSearch.searchConfig.conditionAbstractPanel, { 14 | 15 | getConditionPanel: function(panel, data) { 16 | this.panel = panel; 17 | 18 | var niceName = t("bundle_advancedObjectSearch_group"); 19 | 20 | var myId = Ext.id(); 21 | 22 | return Ext.create('Ext.panel.Panel', { 23 | id: myId, 24 | bodyStyle: "padding: 15px 10px;", 25 | tbar: this.getTopBar(niceName, myId, panel), 26 | layout: this.mainPanelLayout, 27 | scrollable: true, 28 | border: 1, 29 | panelInstance: this, 30 | items: [ 31 | this.getInnerConditionPanel(myId, data) 32 | ] 33 | }); 34 | 35 | }, 36 | 37 | /** 38 | * legacy method since the parent panel of a condition entry panel can 39 | * either be a condition group panel or the condition panel itself 40 | */ 41 | getPanel: function () { 42 | return this.panel.getPanel(); 43 | }, 44 | 45 | getInnerConditionPanel: function(myId, data) { 46 | var helper = new pimcore.bundle.advancedObjectSearch.searchConfig.conditionPanelContainerBuilder(this.classId, this, myId, this.conditionEntryPanelLayout); 47 | this.conditionsContainerInner = helper.buildConditionsContainerInner(); 48 | 49 | if(data.filterEntryData) { 50 | helper.populateConditionsContainerInner(data.filterEntryData); 51 | } 52 | 53 | return Ext.create('Ext.panel.Panel',{ 54 | border: false, 55 | width: "100%", 56 | items: [ 57 | this.getOperatorCombobox(data), 58 | this.conditionsContainerInner 59 | ] 60 | }); 61 | }, 62 | 63 | getOperatorCombobox: function(data) { 64 | this.operatorField = Ext.create('Ext.form.ComboBox', 65 | { 66 | 67 | fieldLabel: t("bundle_advancedObjectSearch_operator"), 68 | store: ["must", "should"], 69 | value: data ? data.operator : "", 70 | queryMode: 'local', 71 | width: 300, 72 | listeners: { 73 | change: function( item, newValue, oldValue, eOpts ) { 74 | 75 | }.bind(this) 76 | } 77 | } 78 | ); 79 | 80 | return this.operatorField; 81 | }, 82 | 83 | getFilterValues: function() { 84 | 85 | var conditionsData = []; 86 | if(this.conditionsContainerInner) { 87 | var conditions = this.conditionsContainerInner.items.getRange(); 88 | for (var i=0; i', 34 | '{[Ext.util.Format.stripTags(values.key)]}', 35 | '' 36 | ) 37 | } 38 | ); 39 | 40 | this.inheritanceField = Ext.create('Ext.form.field.Checkbox', 41 | { 42 | fieldLabel: t("bundle_advancedObjectSearch_ignoreInheritance"), 43 | style: "padding-left: 20px", 44 | value: this.data.ignoreInheritance, 45 | hidden: !this.fieldSelectionInformation.context.classInheritanceEnabled 46 | } 47 | ); 48 | 49 | return Ext.create('Ext.panel.Panel', { 50 | layout: 'hbox', 51 | items: [ 52 | this.getOperatorCombobox(this.data.operator), 53 | this.termField, 54 | this.inheritanceField 55 | ] 56 | }); 57 | } 58 | 59 | }); 60 | -------------------------------------------------------------------------------- /src/Resources/public/js/searchConfig/fieldConditionPanel/time.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.time"); 13 | pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.time = Class.create(pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.datetime, { 14 | 15 | showDateField: false, 16 | 17 | getFilterValues: function() { 18 | 19 | var filterEntryData = {}; 20 | var operatorFieldValue = this.operatorField.getValue(); 21 | 22 | var dateString = "0000-01-01"; 23 | if (this.timefield.getValue()) { 24 | var timeValue = this.timefield.getValue(); 25 | timeValue = Ext.Date.format(timeValue, "H:i:s"); 26 | 27 | dateString += "T" + timeValue; 28 | } 29 | 30 | if(operatorFieldValue == "eq") { 31 | filterEntryData = dateString 32 | } else { 33 | filterEntryData[operatorFieldValue] = dateString; 34 | } 35 | 36 | 37 | var operator = "must"; 38 | if(operatorFieldValue == "exists" || operatorFieldValue == "not_exists") { 39 | operator = operatorFieldValue; 40 | } 41 | 42 | return { 43 | fieldname: this.fieldSelectionInformation.fieldName, 44 | filterEntryData: filterEntryData, 45 | operator: operator, 46 | ignoreInheritance: this.inheritanceField.getValue() 47 | }; 48 | 49 | } 50 | 51 | }); 52 | -------------------------------------------------------------------------------- /src/Resources/public/js/searchConfig/fieldConditionPanel/user.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.user"); 13 | pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.user = Class.create(pimcore.bundle.advancedObjectSearch.searchConfig.fieldConditionPanel.select, { 14 | 15 | }); 16 | -------------------------------------------------------------------------------- /src/Resources/public/js/searchConfig/resultAbstractPanel.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch.searchConfig.resultAbstractPanel"); 13 | pimcore.bundle.advancedObjectSearch.searchConfig.resultAbstractPanel = Class.create(pimcore.object.helpers.gridTabAbstract, { 14 | systemColumns: ["id", "fullpath", "type", "subtype", "filename", "classname", "creationDate", "modificationDate"], 15 | noBatchColumns: [], 16 | batchAppendColumns: [], 17 | batchRemoveColumns: [], 18 | 19 | getSaveDataCallback: null, 20 | gridConfigData: {}, 21 | 22 | portletMode: false, 23 | 24 | fieldObject: {}, 25 | 26 | initialize: function($super) { 27 | $super(); 28 | 29 | this.exportPrepareUrl = "/admin/bundle/advanced-object-search/admin/get-export-jobs"; 30 | this.batchPrepareUrl = "/admin/bundle/advanced-object-search/admin/get-batch-jobs"; 31 | }, 32 | 33 | getLayout: function (initialFilter) { 34 | }, 35 | 36 | updateGrid: function (classId) { 37 | }, 38 | 39 | createGrid: function (fromConfig, response, settings, save) { 40 | } 41 | }); 42 | 43 | 44 | pimcore.bundle.advancedObjectSearch.searchConfig.resultAbstractPanel.addMethods(pimcore.element.helpers.gridColumnConfig); 45 | 46 | -------------------------------------------------------------------------------- /src/Resources/public/js/startup.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This source file is available under the terms of the 3 | * Pimcore Open Core License (POCL) 4 | * Full copyright and license information is available in 5 | * LICENSE.md which is distributed with this source code. 6 | * 7 | * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.com) 8 | * @license Pimcore Open Core License (POCL) 9 | */ 10 | 11 | 12 | pimcore.registerNS("pimcore.bundle.advancedObjectSearch"); 13 | 14 | pimcore.bundle.advancedObjectSearch = Class.create({ 15 | getClassName: function() { 16 | return "pimcore.plugin.advancedObjectSearch"; 17 | }, 18 | 19 | initialize: function() { 20 | document.addEventListener(pimcore.events.pimcoreReady, this.onPimcoreReady.bind(this)); 21 | document.addEventListener(pimcore.events.onPerspectiveEditorLoadPermissions, this.onPerspectiveEditorLoadPermissions.bind(this)); 22 | }, 23 | 24 | onPimcoreReady: function (e){ 25 | var perspectiveCfg = pimcore.globalmanager.get("perspective"); 26 | var user = pimcore.globalmanager.get("user"); 27 | 28 | var searchMenu = pimcore.globalmanager.get("layout_toolbar").searchMenu; 29 | if(searchMenu && perspectiveCfg.inToolbar("search.advancedObjectSearch") && user.isAllowed("bundle_advancedsearch_search")) { 30 | pimcore.bundle.advancedObjectSearch.helper.rebuildEsSearchMenu(); 31 | pimcore.bundle.advancedObjectSearch.helper.initializeStatusIcon(); 32 | } 33 | }, 34 | 35 | onPerspectiveEditorLoadPermissions: function (e) { 36 | let context = e.detail.context; 37 | let menu = e.detail.menu; 38 | let permissions = e.detail.permissions; 39 | 40 | if(context == 'toolbar' && menu == 'search' && 41 | permissions[context][menu].indexOf('items.advancedObjectSearch') == -1) { 42 | permissions[context][menu].push('items.advancedObjectSearch'); 43 | } 44 | } 45 | }); 46 | 47 | var advancedObjectSearchPlugin = new pimcore.bundle.advancedObjectSearch(); 48 | 49 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.ca.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.cs.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.de.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Erweiterte Objektsuche 3 | bundle_advancedObjectSearch_field: Feld 4 | bundle_advancedObjectSearch_condition: Bedingung 5 | bundle_advancedObjectSearch_term: Wert 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Sprache 8 | bundle_advancedObjectSearch_subclass: Klasse 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filter 11 | bundle_advancedObjectSearch_type: Typ 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Ergebnisse 14 | bundle_advancedObjectSearch_fulltextterm: Suchbegriff 15 | bundle_advancedObjectSearch_save_and_share: Speichern & Teilen 16 | bundle_advancedObjectSearch_share: Teilen 17 | bundle_advancedObjectSearch_combine_entries_with: "Eintr\xE4ge kombinieren mit" 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUSS 19 | bundle_advancedObjectSearch_combine_entries_with_should: SOLLTE 20 | bundle_advancedObjectSearch_group: Gruppe 21 | bundle_advancedObjectSearch_save_success: Suche gespeichert 22 | bundle_advancedObjectSearch_save_error: Fehler beim Speichern der Suche 23 | bundle_advancedObjectSearch_category: Kategorie 24 | bundle_advancedObjectSearch_open_saved_searches: "Gespeicherte Suchen \xF6ffnen" 25 | bundle_advancedObjectSearch_new: Neue Suche 26 | bundle_advancedObjectSearch_search: "Gespeicherte Suchen \xF6ffnen" 27 | bundle_advancedObjectSearch_users: Nutzer 28 | bundle_advancedObjectSearch_owner: Besitzer 29 | bundle_advancedObjectSearch_save_as_copy: Als Kopie speichern 30 | bundle_advancedObjectSearch_name_copy_suffix: (Kopie) 31 | bundle_advancedObjectSearch_delete_error: "Fehler beim l\xF6schen der gespeicherten 32 | Suche" 33 | bundle_advancedObjectSearch_delete_really: "M\xF6chten Sie die gespeicherte Suche 34 | wirklich l\xF6schen?" 35 | bundle_advancedObjectSearch_add_to_shortcuts: "Zu Schnellzugriff hinzuf\xFCgen" 36 | bundle_advancedObjectSearch_remove_from_shortcuts: Vom Schnellzugriff entfernen 37 | bundle_advancedObjectSearch_short_cut_error: "Suche kann nicht zum Schnellzugriff 38 | hinzugef\xFCgt werden. Bitte speichern Sie die Suche erst." 39 | bundle_advancedObjectSearch_ignoreInheritance: Keine Vererbung 40 | bundle_advancedObjectSearch_date: Datum 41 | bundle_advancedObjectSearch_updating_index: Suchindex wird aktualisiert 42 | bundle_advancedsearch_search: Erweiterte Objektsuche 43 | bundle_advancedsearch_operator_lt: kleiner als 44 | bundle_advancedsearch_operator_lte: kleiner gleich 45 | bundle_advancedsearch_operator_gt: "gr\xF6\xDFer als" 46 | bundle_advancedsearch_operator_gte: "gr\xF6\xDFer gleich" 47 | bundle_advancedsearch_operator_eq: gleich 48 | bundle_advancedsearch_operator_exists: existiert 49 | bundle_advancedsearch_operator_not_exists: existiert nicht 50 | bundle_advancedsearch_operator_must: muss 51 | bundle_advancedsearch_operator_must_not: darf nicht 52 | bundle_advancedsearch_operator_should: sollte 53 | bundle_advancedObjectSearch_roles: Rollen 54 | bundle_advancedsearch_table_colum_config: Spalte 55 | ... 56 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.en.yml: -------------------------------------------------------------------------------- 1 | bundle_advancedObjectSearch: Advanced Object Search 2 | bundle_advancedObjectSearch_field: Field 3 | bundle_advancedObjectSearch_condition: Condition 4 | bundle_advancedObjectSearch_term: Term 5 | bundle_advancedObjectSearch_operator: Operator 6 | bundle_advancedObjectSearch_language: Language 7 | bundle_advancedObjectSearch_subclass: Class 8 | bundle_advancedObjectSearch_filter: Filter 9 | bundle_advancedObjectSearch_filters: Filters 10 | bundle_advancedObjectSearch_type: Type 11 | bundle_advancedObjectSearch_ids: IDs 12 | bundle_advancedObjectSearch_results: Results 13 | bundle_advancedObjectSearch_fulltextterm: Search Term 14 | bundle_advancedObjectSearch_save_and_share: Save And Share 15 | bundle_advancedObjectSearch_share: Sharing 16 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 17 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 18 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 19 | bundle_advancedObjectSearch_group: Group 20 | bundle_advancedObjectSearch_save_success: Search saved successfully 21 | bundle_advancedObjectSearch_save_error: Error occurred during save search 22 | bundle_advancedObjectSearch_category: Category 23 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 24 | bundle_advancedObjectSearch_new: New 25 | bundle_advancedObjectSearch_search: Open existing Saved Search 26 | bundle_advancedObjectSearch_users: Users 27 | bundle_advancedObjectSearch_owner: Owner 28 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 29 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 30 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 31 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved Search? 32 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 33 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 34 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 35 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 36 | bundle_advancedObjectSearch_date: Date 37 | bundle_advancedObjectSearch_updating_index: Currently updating search index 38 | bundle_advancedsearch_search: Advanced Object Search 39 | bundle_advancedsearch_operator_lt: lower than 40 | bundle_advancedsearch_operator_lte: lower or equal 41 | bundle_advancedsearch_operator_gt: greater than 42 | bundle_advancedsearch_operator_gte: greater or equal 43 | bundle_advancedsearch_operator_eq: equal 44 | bundle_advancedsearch_operator_exists: exists 45 | bundle_advancedsearch_operator_not_exists: not exists 46 | bundle_advancedsearch_operator_must: must 47 | bundle_advancedsearch_operator_must_not: must not 48 | bundle_advancedsearch_operator_should: should 49 | bundle_advancedObjectSearch_roles: Roles 50 | bundle_advancedsearch_table_colum_config: Column 51 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.es.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.fr.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Champ 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: Nouveau 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Utilisateurs 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Sauvegarder une copie 30 | bundle_advancedObjectSearch_name_copy_suffix: (copie) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: "R\xF4les" 52 | bundle_advancedsearch_table_colum_config: Colonne 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.hu.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.it.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.nl.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.pl.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: "Zaawansowane wyszukiwanie obiekt\xF3w" 3 | bundle_advancedObjectSearch_field: Pole 4 | bundle_advancedObjectSearch_condition: Warunek 5 | bundle_advancedObjectSearch_term: Fraza 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: "J\u0119zyk" 8 | bundle_advancedObjectSearch_subclass: Podklasa 9 | bundle_advancedObjectSearch_filter: Filtr 10 | bundle_advancedObjectSearch_filters: Filtry 11 | bundle_advancedObjectSearch_type: Typ 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Wyniki 14 | bundle_advancedObjectSearch_fulltextterm: Fraza Wyszukiwania 15 | bundle_advancedObjectSearch_save_and_share: "Zapisz i Udost\u0119pnij" 16 | bundle_advancedObjectSearch_share: "Udost\u0119pnianie" 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUSI 19 | bundle_advancedObjectSearch_combine_entries_with_should: POWINIEN 20 | bundle_advancedObjectSearch_group: Grupa 21 | bundle_advancedObjectSearch_save_success: Konfiguracja zapisana poprawnie 22 | bundle_advancedObjectSearch_save_error: "Wyst\u0105pi\u0142 b\u0142\u0105d podczas 23 | zapisu konfiguracji" 24 | bundle_advancedObjectSearch_category: Kategoria 25 | bundle_advancedObjectSearch_open_saved_searches: "Otw\xF3rz zapisan\u0105 konfiguracj\u0119" 26 | bundle_advancedObjectSearch_new: Nowe 27 | bundle_advancedObjectSearch_search: "Otw\xF3rz istniej\u0105c\u0105 konfiguracj\u0119" 28 | bundle_advancedObjectSearch_users: "U\u017Cytkownicy" 29 | bundle_advancedObjectSearch_owner: "W\u0142a\u015Bciciel" 30 | bundle_advancedObjectSearch_save_as_copy: Zapisz jako kopia 31 | bundle_advancedObjectSearch_name_copy_suffix: (kopia) 32 | bundle_advancedObjectSearch_delete_error: "Wyst\u0105pi\u0142 b\u0142\u0105d podczas 33 | usuwania konfiguracji" 34 | bundle_advancedObjectSearch_delete_really: "Czy na pewno chcesz usun\u0105\u0107 konfiguracj\u0119?" 35 | bundle_advancedObjectSearch_add_to_shortcuts: "Dodaj skr\xF3t" 36 | bundle_advancedObjectSearch_remove_from_shortcuts: "Usu\u0144 skr\xF3t" 37 | bundle_advancedObjectSearch_short_cut_error: "Nie mo\u017Cna doda\u0107 skr\xF3tu 38 | dla nie zapisanej konfiguracji" 39 | bundle_advancedObjectSearch_ignoreInheritance: Bez dziedziczenia 40 | bundle_advancedObjectSearch_date: Data 41 | bundle_advancedObjectSearch_updating_index: Aktualizacja indeksu wyszukiwarki w trakcie 42 | bundle_advancedsearch_search: "Zaawansowane wyszukiwanie obiekt\xF3w" 43 | bundle_advancedsearch_operator_lt: mniejszy od 44 | bundle_advancedsearch_operator_lte: "mniejszy lub r\xF3wny" 45 | bundle_advancedsearch_operator_gt: "wi\u0119kszy od" 46 | bundle_advancedsearch_operator_gte: "wi\u0119kszy lub r\xF3wny" 47 | bundle_advancedsearch_operator_eq: "r\xF3wny" 48 | bundle_advancedsearch_operator_exists: istnieje 49 | bundle_advancedsearch_operator_not_exists: nie istnieje 50 | bundle_advancedsearch_operator_must: musi 51 | bundle_advancedsearch_operator_must_not: nie musi 52 | bundle_advancedsearch_operator_should: powinien 53 | bundle_advancedObjectSearch_roles: Role 54 | bundle_advancedsearch_table_colum_config: Column 55 | ... 56 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.pt_br.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.ro.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.sk.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.sv.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.th.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Resources/translations/admin.zh_Hans.yml: -------------------------------------------------------------------------------- 1 | --- 2 | bundle_advancedObjectSearch: Advanced Object Search 3 | bundle_advancedObjectSearch_field: Field 4 | bundle_advancedObjectSearch_condition: Condition 5 | bundle_advancedObjectSearch_term: Term 6 | bundle_advancedObjectSearch_operator: Operator 7 | bundle_advancedObjectSearch_language: Language 8 | bundle_advancedObjectSearch_subclass: Class 9 | bundle_advancedObjectSearch_filter: Filter 10 | bundle_advancedObjectSearch_filters: Filters 11 | bundle_advancedObjectSearch_type: Type 12 | bundle_advancedObjectSearch_ids: IDs 13 | bundle_advancedObjectSearch_results: Results 14 | bundle_advancedObjectSearch_fulltextterm: Search Term 15 | bundle_advancedObjectSearch_save_and_share: Save And Share 16 | bundle_advancedObjectSearch_share: Sharing 17 | bundle_advancedObjectSearch_combine_entries_with: Combine Entries with 18 | bundle_advancedObjectSearch_combine_entries_with_must: MUST 19 | bundle_advancedObjectSearch_combine_entries_with_should: SHOULD 20 | bundle_advancedObjectSearch_group: Group 21 | bundle_advancedObjectSearch_save_success: Search saved successfully 22 | bundle_advancedObjectSearch_save_error: Error occurred during save search 23 | bundle_advancedObjectSearch_category: Category 24 | bundle_advancedObjectSearch_open_saved_searches: Open saved Searches 25 | bundle_advancedObjectSearch_new: New 26 | bundle_advancedObjectSearch_search: Open existing Saved Search 27 | bundle_advancedObjectSearch_users: Users 28 | bundle_advancedObjectSearch_owner: Owner 29 | bundle_advancedObjectSearch_save_as_copy: Save as Copy 30 | bundle_advancedObjectSearch_name_copy_suffix: (copy) 31 | bundle_advancedObjectSearch_delete_error: Error during deleting Saved Search 32 | bundle_advancedObjectSearch_delete_really: Do you really want to delete the Saved 33 | Search? 34 | bundle_advancedObjectSearch_add_to_shortcuts: Add To Short Cuts 35 | bundle_advancedObjectSearch_remove_from_shortcuts: Remove From Short Cuts 36 | bundle_advancedObjectSearch_short_cut_error: Cannot add short cut for not saved search 37 | bundle_advancedObjectSearch_ignoreInheritance: No Inheritance 38 | bundle_advancedObjectSearch_date: Date 39 | bundle_advancedObjectSearch_updating_index: Currently updating search index 40 | bundle_advancedsearch_search: Advanced Object Search 41 | bundle_advancedsearch_operator_lt: lower than 42 | bundle_advancedsearch_operator_lte: lower or equal 43 | bundle_advancedsearch_operator_gt: greater than 44 | bundle_advancedsearch_operator_gte: greater or equal 45 | bundle_advancedsearch_operator_eq: equal 46 | bundle_advancedsearch_operator_exists: exists 47 | bundle_advancedsearch_operator_not_exists: not exists 48 | bundle_advancedsearch_operator_must: must 49 | bundle_advancedsearch_operator_must_not: must not 50 | bundle_advancedsearch_operator_should: should 51 | bundle_advancedObjectSearch_roles: Roles 52 | bundle_advancedsearch_table_colum_config: Column 53 | ... 54 | -------------------------------------------------------------------------------- /src/Tools/IndexConfigService.php: -------------------------------------------------------------------------------- 1 | indexNamePrefix = $indexNamePrefix; 43 | $this->indexConfiguration = $indexConfiguration; 44 | } 45 | 46 | /** 47 | * @return string 48 | */ 49 | public function getIndexNamePrefix(): string 50 | { 51 | return $this->indexNamePrefix; 52 | } 53 | 54 | /** 55 | * @param string $indexNamePrefix 56 | */ 57 | public function setIndexNamePrefix(string $indexNamePrefix): void 58 | { 59 | $this->indexNamePrefix = $indexNamePrefix; 60 | } 61 | 62 | /** 63 | * @param string $key 64 | * 65 | * @return mixed 66 | */ 67 | public function getIndexConfiguration(string $key) 68 | { 69 | return $this->indexConfiguration[$key] ?? null; 70 | } 71 | 72 | /** 73 | * @return LoggerInterface|null 74 | */ 75 | public function getLogger(): ?LoggerInterface 76 | { 77 | return $this->logger; 78 | } 79 | } 80 | --------------------------------------------------------------------------------