layout | group | subgroup | title | menu_title | menu_order | version | github_link |
---|---|---|---|---|---|---|---|
default |
fedg |
B_Layouts |
Common layout customization tasks |
Common layout customization tasks |
6 |
2.2 |
frontend-dev-guide/layouts/xml-manage.md |
This article describes the following typical layout customization tasks:
- Set the page layout
- Include static resources (JavaScript, CSS, fonts) in <head>
- Remove static resources (JavaScript, CSS, fonts) in <head>
- Create a container
- Reference a container
- Create a block
- Set the template used by a block
- Modify block arguments
- Reference a block
- Use block object methods to set block properties
- Rearrange elements
- Remove elements
- Replace elements
To ensure stability and secure your customizations from being deleted during upgrade, do not change out-of-the-box Magento module and theme layouts. To customize layout, create extending and overriding layout files in your custom theme.
The type of page layout to be used for a certain page is defined in the page configuration file, in the layout
attribute of the root <page>
node.
Example:
Change the layout of Advanced Search page from default "1-column" to "2-column with left bar". To do this, extend catalogsearch_advanced_index.xml
in your theme by adding the following layout:
app/design/frontend/<Vendor>/<theme>/Magento_CatalogSearch/layout/catalogsearch_advanced_index.xml
{%highlight xml%} ... {%endhighlight xml%}
JavaScript, CSS and other static assets are added in the <head>
section of a page configuration file. The default look of a Magento store page <head>
is defined by app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml
. The recommended way to add CSS and JavaScript is to extend this file in your custom theme, and add the assets there.
The following file is a sample of a file you must add:
<theme_dir>/Magento_Theme/layout/default_head_blocks.xml
{%highlight xml%}
<!-- The following two ways to add local JavaScript files are equal -->
<script src="Magento_Catalog::js/sample1.js"/>
<link src="js/sample.js"/>
<!-- Add external resources -->
<css src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css" src_type="url" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" src_type="url" />
<link src="http://fonts.googleapis.com/css?family=Montserrat" src_type="url" />
</head>
When adding external resources, specifying the src_type="url"
argument value is a must.
You can use either <link src="js/sample.js"/>
or <script src="js/sample.js"/>
instruction to add a locally stored JavaScript file to your theme.
The path to assets is specified relatively to one the following locations:
<theme_dir>/web
<theme_dir>/<Namespace>_<Module>/web
{%highlight xml%} {%endhighlight xml%}
This adds an IE conditional comment in the generated HTML, like in the following example:
{%highlight html%}
{%endhighlight html%}
In this example, orange
is a custom theme created by the OrangeCo vendor.
To remove the static resources, linked in a page <head>
, make a change similar to the following in a theme extending file:
app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default_head_blocks.xml
{%highlight xml%}
<!-- Remove external resources -->
<remove src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css"/>
<remove src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"/>
<remove src="http://fonts.googleapis.com/css?family=Montserrat" />
Note, that if a static asset is added with a module path (for example Magento_Catalog::js/sample.js
) in the initial layout, you need to specify the module path as well when removing the asset.
Use the following sample to create (declare) a container:
{%highlight xml%} {%endhighlight xml%}
To update a container use the <referenceContainer>
instruction.
Example: add links to the page header panel.
{%highlight xml%} header links {%endhighlight xml%}
Blocks are created (declared) using the <block>
instruction.
Example: add a block with a product SKU information.
{%highlight xml%} getSku sku sku {%endhighlight xml%}
To update a block use the <referenceBlock>
instruction.
Example: pass the image to the logo
block.
{%highlight xml%} images/logo.png {%endhighlight xml%}
There are two ways to set the template for a block:
- using the
template
attribute - using the
<argument>
instruction
Both approaches are demonstrated in the following examples of changing the template of the page title block.
Example 1:
{%highlight xml%} {%endhighlight%}
Example 2:
{%highlight xml%} %Namespace_Module::new_template.phtml% {%endhighlight%}
In both example, the template is specified according to the following:
Namespace_Module:
defines the module the template belongs to. For example,Magento_Catalog
.new_template.phtml
: the path to the template relatively to thetemplates
directory. It might be<module_dir>/view/<area>/templates
or<theme_dir>/<Namespace_Module>/templates
.
Template values specified as attributes have higher priority during layout generation, than the ones specified using <argument>
. It means, that if for a certain block, a template is set as attribute, it will override the value you specify in <argument>
for the same block.
To modify block arguments, use the <referenceBlock>
instruction.
Example: change the value of the existing block argument and add a new argument.
Initial block declaration:
{%highlight xml%} ... Block Label ... {%endhighlight xml%}
Extending layout:
{%highlight xml%} ... New Block Label <!- Newly added block argument --> Custom Block Label ... {%endhighlight xml%}
There are two ways to access block object methods:
- using the
<argument>
instruction for<block>
or<referenceBlock>
- using the
<action>
instruction. This way is not recommended, but can be used for calling those methods, which are not refactored yet to be accessed through<argument>
.
Example 1: Set a CSS class and add an attribute for the product page using <argument>
.
Extending layout:
{%highlight xml%} product itemprop="name" {%endhighlight xml%}
Example 2: Set a page title using <action>
.
Do not use <action>
, if the method implementation allows calling it using <argument>
for <block>
or <referenceBlock>
.
Extending layout:
{%highlight xml%} ... Catalog Advanced Search ... {%endhighlight xml%}
In layout files you can change the elements order on a page. This can be done using one of the following:
<move>
instruction: allows changing elements' order and parent.before
andafter
attributes of<block>
: allows changing elements' order within one parent.
In the Magento Blank theme these elements are located as follows:
Let's place the stock availability and SKU blocks after product price block on a product page, and move the review block out of the product-info-price container.
To do this, add the extending catalog_product_view.xml
in the app/design/frontend/OrangeCo/orange/Magento_Catalog/layout/
directory:
{%highlight xml%}
{%endhighlight xml%}
This would make the product page look like following:
To learn how to locate the layout file you need to customize, see Locate templates, layouts, and styles.
Elements are removed using the remove
attribute for the <referenceBlock>
and <referenceContainer>
.
Example: remove the Compare Products sidebar block from all store pages.
This block is declared in app/code/Magento/Catalog/view/frontend/layout/default.xml
:
{%highlight xml%} ... ... {%endhighlight xml%}
To remove the block, add the extending default.xml
in your theme:
<theme_dir>/Magento_Catalog/layout/default.xml
In this file, reference the element having added the remove
attribute:
{%highlight xml%}
... ...{%endhighlight xml%}
To replace an element, remove it and add a new one.