Theming Magento 2 Layout Basics
Theming Magento 2 Layout Basics#
Layouts#
Pull together entire set of template files to be rendered by the browser
View configuration is built into a structure.
- Page layouts and containers - header, left, main, right, footers
- Blocks - each feature on a page
- Content block templates (
.phtml) - Page configuration - content blocks assigned to containers
Extend layout, containing only changes you want.
Overriding base layout file can be done by mimicking the directory but it is not recommended and should be avoided.
Overriding a base layout#
In <Vendor>/<theme>/<Namespace_Module>/layout/override/base/<layout1>.xml
Override a parent theme layout#
In <Vendor>/<theme>/<Namespace_Module>/layout/override/theme/<layout1>.xml
Where to find layout files#
Order of layout files determined by app/etc/config.php
Determines the sequence of inherited themes
Iterated the sequence from last ancestor to the current theme
Core Layout Files#
Module specific page layout in ./view/frontend/page_layout
Page configuration and generic layout files in ./view/frontend/layout and ./view/frontend/base
Extending Page Layouts#
<Theme_dir>/<Namespace>_<Module>/page_layout/<layout1>.xml
Override the theme file#
In <Vendor>/<theme>/<Namespace_Module>/layout/override/theme/<Parent_Vendor>/<parent_theme>/<layout1>.xml
Adding and Extending Layouts (Melding)#
Create an extending layout file that contains changes you want, instead of creating and mdifying many files.
Eg. To customise: app/code/Magento/Catalog/view/frontend/layout/catalog_product_view.xml
Add a layout file in your custom theme:
app/design/frontend/<Vendor>/<theme>/Magento_Catalog/layout/catalog_product_view.xml
Handles#
Each page in magento has a list of layout handles assigned to it:
- Default: default.xml
- Full action name:
catalog_product_view.xml - Page specific handles:
catalog_product_view_type_bundle
Check the common layout customisation tasks
For example to move compare products in default.xml:
<page ...>
<body>
<move element="catalog.compare.sidebar" destination="sidebar.additional" after="-" />
</body>
</page>
Different XML File Types#
- Page layout - overall structure
- Page layout declaration - registers page layouts in Magento
- Page configuration - overall page config and head section (meta, css, js)
- Generic layout - rare, mostly used for ajax response content.
Page layouts#
- Contains blocks and containers
- Defined in
xmlfiles
Finding them: Grep search <layout (.*?)page_layout.xsd">
Container#
Sole purpose of assigning content structure to a page. Just included elements.
A block employs templates into a page.
base layouts are layout files provided by modules
Examples of page layouts:
2 columns left2 columns right3 columns1 columnempty
Products -> Categories -> custom design to set the number of columns
Products -> Catalog -> Design
Product page layouts:
catalog_product_view_type_simple.xmlcatalog_product_view_type_virtual.xmlcatalog_product_view_type_grouped.xmlcatalog_product_view_type_gift_card.xmlcatalog_product_view_type_configurable.xmlcatalog_product_view_type_bundle.xml
Class of the body tag usually points to layout handle used
Instructions to Update page layouts#
Check Layout Files Types
<container name="">- create new container<referenceContainer name="">- reference existing container element<move element="" destination="">- move an element into a new parent container<update handle="">- include instructions from another handle and execute recursively
Page Layout Declararion#
To use a layout you must set it in:
- modules:
app/code/<Namespace>/<Module>/view/frontend/layouts.xml - themes:
app/design/frontend/<Namespace>/<theme>/<Namspace_Module>/layouts.xml
Use: <layout id="layout_file_name">
Page Configuration#
If you want to render a full page you want to use <page>. Otherwise use layout.
One or more of these sections can be declared:
- html
- body
- head
- update
Customisation Tasks#
Change layout#
Copy file and add to theme in same strcuture.
Remove all other nodes except the one you want to change.
Including a static resource#
- Please
default_head_blocks.xmlintoapp/design/frontend/<Vendor>/<theme>/Magneto_Theme/layout/default_head_blocks.xml -
Make customisations:
Include custom js (or css)#
Place component in:
app/design/frontend/<Vendor>/<theme>/web/jsapp/code/<Namespace>/<Module>/view/frontend/web/js
Create a requirejs-config.js file in:
<page ...>
<head>
<script src="js/sample2.js"/>
</head>
</page>
Managing a container#
Check out layout instructions
Create a container:
<container name="some.container" as="someContainer" label="Some Container" htmlTag="div"
htmlClass="some-container">
Update a container:
<referenceContainer name="some.container">
...
</referenceContainer>
Remove a container:
<referenceContainer name="container.name" remove="true" />
Managing a block#
Declare a block:
<block class="Magento\Module\Block\Class" name="block.name" template="template.phtml" after="-">
...arguments
</block
Update a block:
<referenceBlock name="some.block">
<arguments...>
</referenceBlock>
Remove a block:
<referenceBlock name="block.name" remove="true" />
Rearranging blocks:
<move element="block1.name" destination="container1.name" after="-" />
Blocks#
Move reusable functionality into classes for repurposing
Argument values in block can be accessed in template wit:
get{ArgumentName} or has{ArgumentName}
Eg. $this->getCssClass()
class attribute specifies class location for a block:
app/codelib/internalvendor/
Reusable Block Classes#
Magento\Framework\View\Element\Text: Renders simple textMagento\Framework\View\Element\Text\ListText: Renders a list of child blocksMagento\Framework\View\Element\Template: Renders a PHTML fileMagento\Framework\View\Element\Html\Link: Renders a link with various attributes
Templates and Customisation#
Templates are snippets of HTML code and PHP elements
Templates are located in the module: app/code/<Vendor>/<module>/view/_area_/templates
Can enable template hints
Rewrite core template#
- Create your theme
- Create a new template in your theme
- Set your template to the block that contains the core template to rewrite
<theme_dir>/<Namespace>_<Module>/templates
Change template a block uses#
- Copy
app/code/Magento/Sales/view/frontend/layout/sales_guest+form.xmltoapp/design/frontend/<Vendor>/<theme> - Remove everything from the
<body>tag - Add
<ReferenceBlock name="guest.form" template="guest/alternative_form.phtml" />
Create a template block#
Create app/design/frontend/<Vendor>/<theme>/Magento_Theme/layout/default.xml
<page ...>
<referenceContainer name="content">
<block class="Magento\Framework\View\Element\Template" name="custom.name" template="path/to/my/template.phtml">
</referenceBlock/>
</page>
Template Security#
Prevent XSS (Cross site scripting)#
$block->escpateHtml()$block->escapeQuote()$block->escapeUrl()$block->escapeCssUrl()
Escaping is not always necessary#
- typecasting: eg. (int)$count
- output in single quotes
- output in double quotes without variables