Skip to content
You are viewing an outdated version of the documentation.
Click here to switch to the stable version (v6.6), or use the version switcher on the left to navigate between versions.

Ajax Panel

AjaxPanel is a mini-framework based on Storefront plugins. It mimics iFrame behavior by integrating content from different controller actions through ajax into a single view and intercepting, usually page changing events and transforming them into XHR-Requests.

The diagram below shows how this schematically behaves:

image

Basic usage

The AjaxPanel plugin is part of the b2b frontend and will scan your page automatically for the trigger class b2b--ajax-panel. The most basic ajax panel looks like this:

twig
<div
    class="b2b--ajax-panel"
    data-url="{{ path('frontend.b2b.b2bcontact.grid') }}"
>
    <!-- will load content here -->
</div>

After the document is ready, the ajax panel will trigger an XHR GET-Request and replace its inner HTML with the responses content. Now, all clicks on links and forms submitted inside the container will be changed to XHR-Requests.

Extended usage

Any HTML element can be used to trigger a location change in an ajax panel, just add a class and set a destination:

twig
<p class="ajax-panel-link" data-href="{{ path('frontend.b2b.b2bcontact.grid') }}">Click</p>

It might be necessary that certain links in a panel really trigger the default behavior. You just have to add a class to the link or form:

html
<a href="http://www.shopware.com" class="ignore--b2b-ajax-panel">Go to Shopware Home</a>

<form class="ignore--b2b-ajax-panel">
    [...]
</form>

One panel can influence another one by defining and linking to an id.

html
 <div ... data-id="foreign"></div>
 <a [...] data-target="foreign">Open in another component</a>

Ajax panel plugins

The B2B Suite comes with a library of simple helper plugins to add behavior to the ajax panels.

image

As you can see, there is the AjaxPanelPluginLoader responsible for initializing and reinitializing plugins inside b2b-panels. Let's take our last example and extend it with a form plugin:

twig
<div
    class="b2b--ajax-panel"
    data-url="{{ path('frontend.b2b.b2bcontact.grid') }}"
    data-plugins="ajaxPanelFormDisable"
>
    <!-- will load content here -->
</div>

This will disable all form elements inside the panel during panel reload.

While few of them add very specific behavior to the grid or tab's views, there are also a few more commonly interesting plugins.

The b2bAjaxPanelModal plugin helps to open ajax panel content in a modal dialog box. Let's extend our initial example:

twig
<div
    class="b2b--ajax-panel b2b-modal-panel"
    data-url="{{ path('frontend.b2b.b2bcontact.grid') }}"
    data-plugins="ajaxPanelFormDisable"
>
    <!-- will load content here -->
</div>

This will open the content in a modal box.

TriggerReload

Sometimes a change in one panel needs to trigger reload in another panel. This might be the case if you are editing in a dialog and displaying a grid behind it. In this case, you can just trigger reload on other panel id's, just like that:

twig
<div class="b2b--ajax-panel" data-url="{{ path('frontend.b2b.b2bcontact.grid') }}" data-id="grid">
    <!-- grid -->
</div>

<div class="b2b--ajax-panel" data-url="{{ path('frontend.b2b.b2bcontact.edit') }}" data-ajax-panel-trigger-reload="grid">
    <!-- form -->
</div>

Now every change in the form view will trigger reload in the grid view.

TreeSelect

This TreeSelect plugin allows to display a tree view with enabled drag and drop. In the view the div element needs the class is--b2b-tree-select-container and the data attribute data-move-url="{{ path('frontend.b2b.b2brole.move') }}". The controller has to implement a move action, which accepts the roleId, relatedRoleId, and the type.

Possible types:

  • prev-sibling
  • last-child
  • next-sibling