[Rule][Index][Frontend] Indexable price rule conditions and pluggable category sorting (2026.x) - #3243
Merged
dpfaffenbauer merged 8 commits intoSep 15, 2026
Conversation
… category sorting Groundwork for coreshop/product-price-index-bundle. The core only gains generic extension points: - IndexableConditionCheckerInterface / IndexableConditionValuesInterface in the Rule component, implemented by the store, currency, country, zone, customer group, guest, customers, companies, products, categories and timespan condition checkers - new product price rule condition "companies" - Studio badge "Indexable" / "Not indexable" on price rule conditions via ConditionMetaCollector and conditionMeta in the rule config - IdSubselectListingInterface, implemented by the MySQL listing - CategorySortApplierInterface in the FrontendBundle, the category page delegates its sorting; sort labels via coreshop.ui.sort.<key>_<direction> - ValidRulesFetcherInterface::CONTEXT_NO_CACHE bypasses the memory cached rule fetcher - fixed swapped German name sort labels - removed the enum: string DBAL mapping type (breaks schema introspection with DBAL 4.4) - Behat: step for the companies condition, nested condition with customer group and country, fixed "is also priced at" step regex The Studio build archives are not part of this change; the frontend-build workflow regenerates them.
…nding") The category page now renders the sort options from coreshop.ui.sort.<key>_<direction>. The existing English values used a lowercase direction, which changed the visible labels and broke the Behat UI scenario "Sorting in category". Align them with the previous output.
… none ConditionMetaCollector merges the results of all services tagged coreshop.rule.condition_meta_provider (ConditionMetaProviderInterface) instead of computing the price index indexability itself. The Studio rule editor only renders the "Indexable" / "Not indexable" badge when a provider delivered the "indexable" key, so without the product price index bundle nothing is shown.
Contributor
🚦 PR Guardrail
❌ R5 — CIFailed checks on the current head: ➡️ Fix the failed checks and push the fix. The guardrail re-evaluates automatically once CI completes. ℹ️ Some CI checks are still running. The CI result is re-evaluated automatically once they finish. Automated comment by the PR guardrail — details and FAQ: |
The core documents only the ConditionMetaProviderInterface mechanism; what a specific bundle contributes belongs into that bundle's documentation.
bin/console lint:yaml runs without custom tags, so !tagged_iterator is not allowed in the bundle configs. ConditionMetaProviderPass hands the tagged services to the ConditionMetaCollector instead.
|
dpfaffenbauer
deleted the
issue/3242-indexable-price-rule-conditions
branch
September 15, 2026 06:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Groundwork for coreshop/product-price-index-bundle, which precomputes product prices per store / currency / country / customer group / company / customer so listings can filter and sort by price. The core only gains generic extension points, nothing price-index specific.
Changes
IndexableConditionCheckerInterface(a condition declares the context dimensions its outcome depends on) andIndexableConditionValuesInterface(the ids it explicitly references). Implemented by the store, currency, country, zone, customer group, guest, customers, companies, products, categories and timespan condition checkers. Quantity, cart voucher and custom conditions without the interface are treated as not indexable.companies(CompaniesConditionChecker,CompaniesConfigurationType, translations).ConditionMetaCollector(RuleBundle) computes the meta, the product price rule config and the specific price rules adapter expose it asconditionMeta, theConditionRegistrycarries it toConditionItem.IdSubselectListingInterface, implemented by the MySQL listing: the ids matching a listing as an SQL subselect (optionally excluding one filter field) for set based joins with other tables.CategorySortApplierInterfacewith a default implementation;CategoryControllerdelegates sorting to it so bundles can decorate it to add sort options. Sort labels come fromcoreshop.ui.sort.<key>_<direction>with the previous " ascending" fallback. Fixed the swapped German name sort labels.ValidRulesFetcherInterface::CONTEXT_NO_CACHE; a price context carrying it bypassesMemoryCachedValidRuleFetcher.enum: stringmapping type fromconfig/packages/doctrine_mapping_types.yaml. DBAL 4.4 maps ENUM natively and the mapping broke every schema introspection (Column "type" has invalid type) in migrations and bundle installers.Notes
Resources/build-dist) are not part of this PR; the frontend-build workflow regenerates them on merge.domain_filteranddomain_indexwere run locally against these changes; the bundle's own suite (42 scenarios) runs against this branch via a composer path repository.Closes #3242