こんにちは!
Nishiです。前回はMagentoの before・after・removeでレイアウトを変更する方法 についての記事を書きました。
今回は、既存のBlockやContainerを別の場所へ移動する <move> タグについて書いていきたいと思います。
前回紹介した before・after は、同じ親要素の中でBlockやContainerの表示順序を変更するためのものでした。
今回の <move> を使うと、「フッターにある要素をコンテンツエリアへ持ってくる」といった、
親要素をまたいだ移動ができるようになります。
※本記事は、Magento Open Source 2.4.7-p3 を使用しています。
<move>タグとは?
<move>は、すでにレイアウトに存在しているBlockやContainerを、別の場所へ移動させるためのタグです。
before・afterとの違いは以下のとおりです。
- before・after … 同じ親要素内での順番変更
- <move> … 別の親要素へ移動(+移動先での順番指定)
つまり、「順番だけ変えたい」場合はbefore・after、
「配置する場所そのものを変えたい」場合は<move>を使用します。
基本の書き方
<move>は以下のように書きます。
<move element="移動させたい要素名" destination="移動先の要素名"/>
主な属性は以下のとおりです。
- element … 移動させたい要素の名前
- destination … 移動先の要素の名前
- before・after … 移動先での表示位置
elementとdestinationは必須で、before・afterは必要に応じて指定します。
また、<move>は<referenceContainer>や<referenceBlock>の中に記述するのではなく、
<body>タグの直下に記述します。
このほかに as という属性もありますが、初めのうちは使う機会が少ないため、またの機会に書きたいと思います。
実際に移動させてみよう
それでは、実際に<move>を使ってみましょう。
今回は、Magento標準でフッターに表示されている「ニュースレター登録」フォームを、
トップページのコンテンツエリアへ移動してみます。
[補足]
前回の記事の下記removeが残っている場合は、コメントアウトや削除をしておいてください。
removeの設定が残っていると、ニュースレター登録フォームがレイアウトから除外された状態になり、<move>で移動先を指定しても表示されません。
app/design/frontend/Test/CustomTheme/Magento_Theme/layout/default.xml
<referenceBlock name="form.subscribe" remove="true"/>
cms_index_index.xmlにmoveを追記する
続いて、トップページ用のLayout XMLに <move> を記載します。
今回使用するファイルは以下です。
app/design/frontend/Test/CustomTheme/Magento_Cms/layout/cms_index_index.xml
ファイルを開き、以下のように記載します。
<?xml version="1.0"?><page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <block class="Magento\Cms\Block\Block" name="custom.cms.block.a"> <arguments> <argument name="block_id" xsi:type="string">test_block</argument> </arguments> </block> </referenceContainer> <move element="form.subscribe" destination="content"/> </body></page>
今回追加したのは、以下の部分です。
<move element="form.subscribe" destination="content"/>
elementには、移動させたいBlockの名前を指定します。
今回は、ニュースレター登録フォームのBlockに付けられているform.subscribeを指定しています。
element="form.subscribe"
そして、destinationには移動先を指定します。
今回はトップページのコンテンツエリアであるcontentを指定しています。
destination="content"
つまり、form.subscribe → content というように、
ニュースレター登録フォームをcontentへ移動しています。
キャッシュをクリアして、画面を確認してみましょう。
$ bin/magento c:c
フッターに表示されていたニュースレター登録フォームが、トップページのコンテンツエリアに表示されるようになります。
このように、<move>を使用することで、既存のBlockを別の場所へ移動することができます。
ただし、今回は cms_index_index.xml に記述しているため、この移動が反映されるのはトップページのみです。
他のページでは、ニュースレター登録フォームはフッターに表示されたままになります。
また、<move> はBlockだけでなく、Containerも移動することができます。
基本的な指定方法はBlockの場合と同じで、
element に移動させたいContainerの名前、destination に移動先を指定します。
移動先での表示順を指定する方法
<move>では、移動先だけでなく、移動先での表示位置もあわせて指定することができます。
書き方は以下のとおりです。いずれかを指定して、移動先での表示位置を調整します。
<!-- custom.cms.block.a の前に配置 --><move element="form.subscribe" destination="content" before="custom.cms.block.a"/><!-- custom.cms.block.a の後ろに配置 --><move element="form.subscribe" destination="content" after="custom.cms.block.a"/><!-- 移動先の先頭に配置 --><move element="form.subscribe" destination="content" before="-"/><!-- 移動先の最後に配置 --><move element="form.subscribe" destination="content" after="-"/>
before・afterの詳しい使い方については、
前回の記事「Magento: before・after・removeでレイアウトを変更してみよう」で紹介しています。
<move> を使うときの注意点
<move> は「すでに存在している要素を動かす」ためのタグです。
存在しない要素名や destination を指定しても反映されないため、
移動が反映されない場合は、要素名と移動先の名前が正しいか確認してみましょう。
また、Layout XMLを変更した場合は、キャッシュクリアも忘れずに行います。
最後に
今回は、既存のBlockやContainerを別の場所へ移動する <move> タグについて確認しました。
- <move> … 既存のBlockやContainerを別の場所へ移動する
- element … 移動させたい要素を指定する
- destination … 移動先を指定する
- before・after … 移動先での表示位置を指定する
<move>を使うことで、コアファイルを変更せずに、
独自テーマ側のLayout XMLから既存のBlockやContainerの配置場所を変更することができます。

