menu
Oro Documentation: Find everything you need to use and develop your OroCommerce, OroCRM, and OroPlatform application
    Result in:
    close
    • Back to Oro Inc
    • Users
      • Solution ArchitectureLearn about the OroCommerce architecture, integration points, and the infrastructure to implement it.
      • Concept GuidesGet contextual references to detailed feature descriptions based on your business use case.
      • Back-OfficeExplore the key features and learn to automate workflows, create reporting and much more.
      • Commerce StorefrontIntroduction to OroCommerce default storefront navigation, interaction, and browsing.
      • IntegrationsExplore OroCommerce's pre-built and custom integration options.
      • GlossaryNavigate OroCommerce terms easily with our comprehensive glossary guide.
      Up for a challenge? Validate your skills and earn the Oro Certificate!
      • Learn More
    • Developers
      • Backend Developer GuideComprehensive documentation on installing, customizing, and maintaining Oro applications efficiently.
      • Frontend Developer GuideLearn to efficiently customize Oro apps appearance both on the Storefront and in the Back-office.
      • Oro Bundles & ComponentsExplore Oro Config Component and core bundle implementation for non-standard customizations.
      • Web Services API GuideIntegrate Oro functionality into third-party systems with REST API guide.
      • Community GuideLearn about the best ways to contribute to Oro applications, and engage with the Oro community.
      Up for a challenge? Validate your skills and earn the Oro Certificate!
      • Learn More
    • Cloud Administrators
      • ArchitectureUncover OroCloud's architecture with illustrative diagrams for deeper understanding.
      • Environment TypesUnderstand OroCommerce environment types for tailored deployment options and configurations.
      • SecurityDiscover OroCloud network diagram and Oro's comprehensive security protocols.
      • MonitoringEnsure service continuity and proactive resource management with OroCloud monitoring tools.
      • OnboardingStreamline your Oro application deployment with our comprehensive onboarding process guide.
      • VPN ConnectionLearn how to connect OroCloud VPN across different operating systems.
      • MaintenanceExplore the tools to manage maintenance tasks within your OroCloud environment.
      • SupportDiscover Oro's support process for Oro authorized partners and Enterprise customers.
      Up for a challenge? Validate your skills and earn the Oro Certificate!
      • Learn More
    • OroCommerce
    • OroHive
    • Documentation >
    • Developers >
    • Oro Bundles and Components >
    • OroProductBundle >
    • Related Items
    • Oro Bundles and Components
      • Components
        • Configuration Merger
        • Cumulative Resources
        • System Aware Resolver
        • Resources Loader Factory
      • ActionBundle
      • ActivityBundle
        • Commands
      • ActivityListBundle
      • AddressBundle
      • ApiBundle
      • AssetBundle
        • Commands
      • AttachmentBundle
        • OroAttachmentBundle Configuration
        • Displaying Pictures
        • Generating Image and File URLs
        • Image Placeholder Configuration
      • BatchBundle
      • CacheBundle
      • CalendarBundle
        • Calendar Provider
        • Calendar Context Menu
        • System Calendars
        • Workflow Action
        • Recurring Events
        • UID (Unique Calendar Identifier)
        • Calendar Event Ownership
        • Attendees
      • ChartBundle
      • CommentBundle
      • ConfigBundle
      • CronBundle
      • CurrencyBundle
        • Multi Currency Cell Content Editor
      • DashboardBundle
      • DataAuditBundle
      • DataGridBundle
        • Default Editors
      • DistributionBundle
      • DigitalAssetBundle
      • ElasticSearchBundle
        • Index Agent and Search Engine
        • ElasticSearch Indexes Backup
        • ElasticSearch Configuration
        • Request Builders
        • Troubleshooting
        • Upgrade Website Index to Elasticsearch >=8.4, <9.0
      • EmailBundle
        • Transports
        • Events
        • Emails
        • Email Templates
        • Loading an Email Template
        • Rendering an Email Template
        • Email Templates Rendering Sandbox
        • Email Templates Inheritance
        • Sending an Email Created from an Email Template
        • Email Templates Migrations
        • System Mailboxes
        • Email Ownership
        • Sending Emails in Workflows and Actions (Operations)
        • Recipients Autocompletion
        • Public and Private Emails
        • Commands
      • EmbeddedFormBundle
      • EntityBundle
        • EntityModel
        • EntitySelectSearchApiAccessor ⇐ SearchApiAccessor
        • EntityStructureDataProvider
      • EntityConfigBundle
      • EntityExtendBundle
      • EntityMergeBundle
      • EntityPaginationBundle
      • EntitySerializedFieldsBundle
      • FeatureToggleBundle
      • FilterBundle
        • Filter Form Types
        • Grid Extension
      • FormBundle
        • Form Components Overview
        • Update Handler
        • Entity Create or Select Form Type
        • Rich Text Form Type
        • Autocomplete Form Type
        • Text Autocomplete Form Type
        • UI DataBlock Config Overview
        • Expression Editor
        • Client Side Validation
        • InlineEditableViewComponent
        • Index of Supported Editors
          • AbstractRelationEditorView
          • TextEditorView
          • NumberEditorView
          • PercentEditorView
          • DateEditorView
          • DatetimeEditorView
          • SelectEditorView
          • MultiSelectEditorView
          • MultiCheckboxEditorView
          • MultiRelationEditorView
          • RelatedIdRelationEditorView
          • RelatedIdSelectEditorView
        • Search APIs
        • CAPTCHA Protection
      • GaufretteBundle
      • GridFSConfigBundle
      • ImapBundle
        • Usage Example
        • Synchronization with IMAP Servers
        • OAuth Providers for Mailboxes
        • User Email Origin Transport
      • ImportExportBundle
        • Commands
      • InstallerBundle
        • Commands
      • IntegrationBundle
      • InvoiceBundle
        • Invoice Number Generation
        • Configuration
      • LayoutBundle
        • Layout Cache
        • Old Themes
      • LocaleBundle
        • Locale Settings
        • Number Formatting
        • Date and Datetime Formatting
        • Name Formatting
        • Address Formatting
        • Localization
        • Managing Localizations
        • Current Localization
        • Localized Values
        • CLI Commands (LocaleBundle)
      • LoggerBundle
      • MessageQueueBundle
        • Commands
      • MigrationBundle
        • Commands
      • MicrosoftSyncBundle
      • NavigationBundle
        • Menu Updates
        • Commands
      • NoteBundle
      • NotificationBundle
      • OAuth2ServerBundle
        • Commands
      • OrganizationBundle
      • PlatformBundle
        • Number Sequence Management
        • Commands
      • QueryDesignerBundle
        • Query Designer Configuration
        • Condition Builder Component
      • RedisConfigBundle
        • Configure Redis Servers
        • Configure Application to Use Redis
      • ReportBundle
      • ScopeBundle
      • SearchBundle
        • Configuration
        • Console Commands
        • ORM Search Engine
        • Search Relevance Weight
        • DateTimeFormatter
      • SecurityBundle
      • SegmentBundle
      • SidebarBundle
      • SyncBundle
        • Configuration
        • Client
        • Topics and Handlers
        • Authentication
        • Content Outdating
        • Origin Checking
        • Mediator Handlers
      • TagBundle
        • TagsEditorView
        • TagsView
      • TestFrameworkBundle
        • Additional Doctrine Events
      • ThemeBundle
      • TranslationBundle
        • Commands
      • TwigInspectorBundle
      • UIBundle
        • Action Manager
        • Client Side Navigation
        • Content Providers
        • Dynamic Assets
        • Formatters
        • Scroll Data Customization
        • TWIG Placeholders
        • TWIG Filters
        • Widgets
        • ApiAccessor
        • BaseClass
        • HiddenInitializationView ⇐ BaseView
        • Layout Subtree View
        • LoadMoreCollection
        • Loading Mask View
        • MultiUseResourceManager ⇐ BaseClass
        • PersistentStorage
        • Highlight Text View
        • RouteModel
        • RoutingCollection
        • SearchApiAccessor
        • Viewport Manager
        • Error Handler
        • Input Widgets
        • Items Manager
        • Mediator Handlers
      • WindowsBundle
      • WorkflowBundle
        • Commands
      • DraftBundle
        • How to Use Drafts
        • How to Use Draft ACL
        • How to Use the Draft Filter
        • How to Resolve Draft Conflicts
        • How to Use a Draft Extension
      • PdfGeneratorBundle
        • Architecture Details
        • Configuration
        • Create PDF Document
        • Create PDF Document Type
        • Create PDF File
        • Create PDF Options Preset
        • Download PDF Document
        • PDF Template Renderer
      • AddressValidationBundle
      • CatalogBundle
      • CheckoutBundle
        • Checkout Start
        • Checkout Subtotal
        • Checkout Finish
        • Order Confirmation Email
        • Shipping Context
        • Payment Context
        • Dependency Injection Tags
        • Checkout Customization
      • CMSBundle
        • Content Widgets
        • Content Widget Types
        • WYSIWYG Field
          • How to Add WYSIWYG Field
          • How to Display a WYSIWYG Field
          • How to Change Textarea Field to WYSIWYG Field
          • WYSIWYG Field Validation
        • Content Blocks
        • Create Editor Components
      • ConsentBundle
        • Add the Customer Consents Field to a Form (Example)
        • Add the Agreements Step to a Custom Checkout Based on the Default Checkout Workflow (Example)
        • Add the Agreements Section to a Custom Checkout Based on the Single Page Checkout Workflow (Example)
      • CommerceMenuBundle
        • Main Navigation Menu
        • Menu Updates
        • Menu Templates
        • Content Node Menu Items
        • Category Menu Items
      • CommerceInvoiceBundle
      • InvoicePaymentBundle
        • How to Create an Invoice Payment Method
      • CookieConsentBundle
      • CustomerBundle
      • CustomerRecommendationBundle
      • FrontendBundle
        • Frontend Sessions and Debug Routes
        • Email Templates
        • Frontend Access
        • Set Up Mass Action in Datagrid
        • Sticky Element View
        • Dom Relocation Global View
      • InventoryBundle
      • MultiWebsiteBundle
        • Email Templates
      • OrderBundle
        • Previously Purchased Products
      • PayPalBundle
      • PricingBundle
        • Getting a Product Price
        • Getting Price for a Product Line Item
        • Getting a Product Kit Price by API
        • Configure Price List Sharding
        • Optimize Website Indexation and Price Recalculation
        • Combined Price List
        • Price Storage
        • Pricing Strategy
        • Commands
      • PromotionBundle
      • ProductBundle
        • Product Actions
        • Product Attributes
        • Product Kits
        • Product Unit Formatting
        • Product Variant Search
        • Related Items
        • Externally Stored Product Images
        • Product Customization Using Layouts
          • Customize Product View Page
          • Customize Product List Page
          • Customize Product Lists
          • Customize Products SKU Validation
      • RedirectBundle
      • SellerDashboardBundle
      • SEOBundle
        • Sitemap
        • SEO Meta Fields
      • ShoppingListBundle
        • Shopping List in the Storefront
      • TaxBundle
      • WarehouseBundle
      • WebCatalogBundle
      • WebsiteElasticSearchBundle
        • Website ElasticSearch Search Engine
        • Website ElasticSearch Configuration
        • Attributes Boost
        • Request Builders
        • Upgrade Website Index to Elasticsearch >=8.4, <9.0
        • Search Synonym Management
      • WebsiteSearchBundle
        • Website Search Configuration
        • Search Index Structure
        • Console Commands
        • Perform Search
        • WebsiteSearch Indexation Process
        • ORM Search Engine
        • Search Relevance Weight
        • Testing
      • SalesFrontendBundle
        • Commands
        • Configuration
        • CORS
        • CSP
        • Endpoints
        • Login Flow
        • Login Page
        • Routing Prefix
        • Web Server Config
      • FrontendPdfGeneratorBundle
      • ActivityContactBundle
      • AnalyticsBundle
      • ChannelBundle
      • SalesBundle
      • ApruveBundle
      • AuthorizeNetBundle
      • DotmailerBundle
      • DPDBundle
      • GoogleTagManagerBundle
      • InfinitePayBundle
      • MailchimpBundle
      • MakerBundle
      • PaypalExpressBundle
      • StripeBundle
      • StripePaymentBundle
        • Action Executors
        • Commands
        • Configuration
        • Stripe Amount Format
        • Stripe Amount Validation
        • Stripe Script
        • Re-authorization
        • Webhook Events
        • Invoice Payments
      • AiContentGenerationBundle
      • StorefrontAgentBundle
    Version:
    6.1 (latest)
    • 5.1
    • 6.0
    • 6.1 (latest)
    • 7.0 (dev)
    • Contents
      • Classes
        • Config provider
        • Strategies
          • Finder Strategy
          • Assigner Strategy

    Related Items 

    Usually, when you sell a product you also offer your customers some related products that are a tempting or useful add-on to the product. For example, if you are selling phones, it is good to show fitting accessories next to it. This is where the Related Items functionality comes handy.

    Classes 

    Config provider 

    The interface Oro\Bundle\ProductBundle\RelatedItem\RelatedItemConfigProviderInterface represents the configuration for Related Items.

    Example:

    You can find example in Oro\Bundle\ProductBundle\RelatedItem\RelatedProduct\RelatedProductsConfigProvider.

    Here is the quick overview of its usage:

    isEnabled()

    $this->get('oro_product.related_item.related_product.config_provider')->isEnabled();
    

    Returns information on whether the Related Items functionality is enabled.

    getLimit()

    $this->get('oro_product.related_item.related_product.config_provider')->getLimit();
    

    Returns integer describing how many related products can be assigned for one product.

    isBidirectional()

    $this->get('oro_product.related_item.related_product.config_provider')->isBidirectional();
    

    Returns information about the relation type. To illustrate the difference between uni- and bidirectional relation, let us consider the following example. Product B is a related item of Product A. If bidirectional attribute value is set to true, the product A is also considered as related item of Product B (see Finder Strategy). This does not apply when the relation is not bidirectional.

    When viewing product A in the storefront, a buyer can always see the Product B in related items. When viewing product B in the storefront, the buyer may or may not see the Product A in related items (depending on the type of relationship).

    isBidirectional == True and Product B is a related item of Product A

    Product

    Related Items

    Product A

    Product B

    Product B

    Product A

    isBidirectional == False and Product B is a related item of Product A

    Product

    Related Items

    Product A

    Product B

    Product B

    None

    For more information about configuration see OroConfigBundle.

    Strategies 

    Finder Strategy 

    The finder strategy (Oro\Bundle\ProductBundle\RelatedItem\FinderStrategyInterface) provides related products for a user. You can see a simple example in Oro\Bundle\ProductBundle\RelatedItem\RelatedProduct\FinderDatabaseStrategy where related products are fetched from the database. This strategy takes into account the configuration from the Config Provider.

    For more complex logic, you can create your own strategy.

    For this, implement Oro\Bundle\ProductBundle\RelatedItem\FinderStrategyInterface, overload or decorate its definition: “oro_product.related_products.strategy”, and provide the implementation of the find method:

    /**
     * @param Product $product
     * @return Product[]
     */
    public function find(Product $product);
    

    where $product is a Product object for which you are searching related products. The method has to return an array of Products.

    Assigner Strategy 

    The assigner strategy (Oro\Bundle\ProductBundle\RelatedItem\AssignerStrategyInterface) provides a way to store the relation between the product and its related item. An example of the implementation can be found in Oro\Bundle\ProductBundle\RelatedItem\RelatedProduct\AssignerDatabaseStrategy.

    It defines two methods:

    1. addRelations()

      /**
       * @param Product $productFrom
       * @param Product[] $productsTo
       *
       * @throws \LogicException When functionality is disabled
       * @throws \InvalidArgumentException When a user tries to add a related product to itself
       * @throws \OverflowException When a user tries to add more products than the limit allows
       */
      public function addRelations(Product $productFrom, array $productsTo);
      

      The addRelations method saves the Related Items relations: from $productFrom to every product provided in $productsTo. The following exceptions may be thrown:

      • LogicException should be thrown when Related Items functionality is disabled.

      • InvalidArgumentException should be thrown, when a user tries to add product as a related item for itself.

      • OverflowException should be thrown when a user tries to add more products that the configured limit allows.

    2. removeRelations()

      /**
       * @param Product $productFrom
       * @param Product[] $productsTo
       */
      public function removeRelations(Product $productFrom, array $productsTo);
      

      The removeRelations method removes all Related Item relationships between the product provided in $productsTo and the $productFrom product. When a product in $productsTo is not a Related Item of the $productFrom, no exception should be thrown and the invalid relationship should be skipped. Other Related Items relationships should be processed.

    Get the latest Oro News

    • OroCommerce
    Compliances
    • Compliances
    • pci-dssfooter1SOCfooter1

    About Us

    • About us
    • Partners
    • Events
    • Careers
    • Bug Bounty

    Certifications

    • PCI DSS
    • SOC2

    Services

    • Oro Services
    • Training

    More Resources

    • Guides & Reports
    • Documentation
    • OroCommerce Blog

    Compliances

    pci-dssfooter1 SOCfooter1

    Follow Oro

    Oro GitHub Oro linkedin Oro twitter Oro Youtube
    © 2024 Oro, Inc. All Rights Reserved
    Terms & Conditions Privacy Policy Data Protection Framework Certification

    Follow Oro

    Oro GitHub Oro linkedin Oro twitter Oro Youtube
    Back to top