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 >
    • OroNavigationBundle >
    • Menu Updates
    • 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
          • Email Templates Attachments
        • 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
        • Email Templates Attachments
        • 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
        • Invoice PDF Documents
        • 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
      • PaymentBundle
        • Payment Status
      • 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
      • Menu Update Scopes
      • Menu Update Types
        • System Type
        • Custom Type
        • Synthetic Type
      • Menu Update Builder
      • Menu Update Applier
        • Menu Update to Menu Item Propagator
      • Menu Update Manager
        • Menu Item to Menu Update Propagator

    Menu Updates 

    OroNavigationBundle introduces a mechanism called Menu Updates that allows creating and modifying menu items in different scopes using back-office UI.

    The architecture of this mechanism consists of the following:

    1. Entity class Oro\Bundle\CommerceMenuBundle\Entity\MenuUpdate to store the changes made to menu items.

    2. Menu builder Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder that applies menu updates for the current scope.

    3. Menu updates provider Oro\Bundle\NavigationBundle\Provider\MenuUpdateProvider that provides menu updates for the current scope.

    4. Menu update applier Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier that applies each menu update.

    5. Menu-update-to-menu-item propagator Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\CompositePropagator that propagates the data stored in a MenuUpdate into the corresponding menu item.

    Menu Update Scopes 

    Oro applications enable you to configure back-office menus in 3 scopes: global, organization, and user. For user documentation, see Edit back-office menus.

    Menu Update Types 

    Depending on how menus were created, there are three types of updates:

    • system

    • custom

    • synthetic

    The item menu affected by the menu update is additionally marked with an extra option indicating the type of the update, so the system / custom / synthetic concept can be applied not only to the menu update, but also the menu item.

    System Type 

    This menu update is aimed at modifying a menu item initially created by the application via navigation.yml or a menu builder. Menu update is treated as system if both custom and synthetic fields are set to false. A system menu update is created when a user either submits the form of an already existing menu item, moves the menu item, or toggles the menu item display using Show / Hide buttons in the back-office menu management UI. The menu update of the system type cannot modify a non-existing menu item and should not create a new one, so if the target menu item from which the menu update was initially created is missing, then the corresponding changes enclosed in the menu update become lost.

    Custom Type 

    This menu update aims to create a new menu item or modify one if it is already created by a custom menu update in the parent scope. Menu items affected by these menu updates are marked with the Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::IS_CUSTOM extra option. The menu update is treated as custom if the custom field is set to true. A custom menu update is created when a user hits the “Create Menu Item” button and submits the form in the back-office menu management UI.

    Synthetic Type 

    This menu update modifies or creates a new menu item if it does not already exist. Menu items affected by these menu updates are marked with the Oro\Bundle\NavigationBundle\Entity\MenuUpdateInterface::IS_SYNTHETIC extra option. Menu update is treated as synthetic if the synthetic field is set to true. A synthetic menu update is created when a user either submits the form, moves the menu item, or toggles the menu item display of an already existing menu item that can become synthetic in the back-office menu management UI. The ability of a menu item to produce a synthetic menu update can be controlled by a propagator, which is a class that implements the Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\MenuItemToMenuUpdatePropagatorInterface interface. This type is not used out-of-the-box in OroPlatform.

    Unlike the system menu update, the synthetic one can create a new menu item if the target one is missing, and in contrast to the custom menu update, the synthetic one can be created only from a system menu item (e.g., by moving the menu item or toggling the menu item display using Show / Hide buttons in the back-office menu management UI).

    Menu Update Builder 

    Oro\Bundle\NavigationBundle\Menu\MenuUpdateBuilder menu builder collects all menu updates for the current scope from the Oro\Bundle\NavigationBundle\Provider\MenuUpdateProvider provider and applies them to a menu using Menu Update Applier.

    After all menu updates are applied, the menu builder dispatches the Oro\Bundle\NavigationBundle\Event\MenuUpdatesApplyAfterEvent event with the context object Oro\Bundle\NavigationBundle\MenuUpdate\Applier\Model\MenuUpdateApplierContext with applied menu updates and changes made to the menu.

    Menu Update Applier 

    Oro\Bundle\NavigationBundle\MenuUpdate\Applier\MenuUpdateApplier is responsible for applying a specific Menu Update to menu: create, update or move a specific menu item. The responsibility of applying other data (e.g. title, description, etc.) is delegated to the propagator Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\CompositePropagator.

    MenuUpdateApplier stores the following details of the menu update in context object Oro\Bundle\NavigationBundle\MenuUpdate\Applier\Model\MenuUpdateApplierContext:

    1. Created menu items.

    2. Updated menu items.

    3. Lost menu items: menu items created by a system menu update, but the target system menu items do not exist anymore.

    4. Orphaned menu items: menu items without a parent menu item (parent menu item does not exist).

    Note

    Orphaned menu items are placed into the menu root by Oro\Bundle\NavigationBundle\Menu\OrphanItemsBuilder at the end of the menu builders chain.

    Note

    Lost menu items are removed from the menu by Oro\Bundle\NavigationBundle\Menu\LostItemsBuilder at the end of the menu builders chain.

    Menu Update to Menu Item Propagator 

    The propagator is represented by a composite class Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\CompositePropagator that calls inner propagators:

    1. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\BasicPropagator: fills the menu item label, URI, display (shown/hidden), link attributes.

    2. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\ExtrasPropagator: fills the menu item extras with fields that are not represented in the menu item explicitly.

    Note

    You can create your own menu-update-to-menu-item propagator by creating a class implementing Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuItem\MenuUpdateToMenuItemPropagatorInterface and registering it as a service with tag oro_navigation.menu_update.propagator.to_menu_item.

    Menu Update Manager 

    Oro\Bundle\NavigationBundle\Manager\MenuUpdateManager is responsible for CRUD operations on MenuUpdate entities. The responsibility of creating a Menu Update is delegated to the factory Oro\Bundle\NavigationBundle\MenuUpdate\Factory\MenuUpdateFactory and propagator Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\CompositePropagator.

    There are additional managers responsible for other operations on MenuUpdate entities:

    1. Oro\Bundle\NavigationBundle\Manager\MenuUpdateMoveManager is responsible for moving menu items.

    2. Oro\Bundle\NavigationBundle\Manager\MenuUpdateDisplayManager is responsible for toggling the display state (shown/hidden).

    Menu Item to Menu Update Propagator 

    The propagator is responsible for taking menu item data and copying it to the MenuUpdate entity. It is represented by a composite class Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\CompositePropagator that calls inner propagators:

    1. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\BasicPropagator: fills parentKey, display state (shown/hidden), URI.

    2. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\TitlePropagator

    3. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\DescriptionPropagator

    4. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\ExtrasPropagator: fills Menu Update fields with data found in extras options of the menu item.

    Note

    You can create your own menu-item-to-menu-update propagator by creating a class implementing Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\MenuItemToMenuUpdatePropagatorInterface and registering it as a service with tag oro_navigation.menu_update.propagator.to_menu_update.

    In order not to store in the menu update the data not explicitly seen and approved by a user (by submitting the menu item form), menu-item-to-menu-update propagators are called according to the specified strategy:

    1. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\MenuItemToMenuUpdatePropagatorInterface::STRATEGY_FULL: used for propagating the menu update to show in the form in the back-office menu management UI.

    2. Oro\Bundle\NavigationBundle\MenuUpdate\Propagator\ToMenuUpdate\MenuItemToMenuUpdatePropagatorInterface::STRATEGY_BASIC: used for propagating the menu update when a menu item is moved or its display state is toggled in the back-office menu management UI.

    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