まずやりたいこととしては、
Homeページなどで動的に設定したSectionを、他のProductsやCollectionsといったページでも設定を保持したままSectionを追加したいというものです。
Dawnテーマを使用して、Sectionはblocksで複数のCollectionを設定できるようにしています。
このCollectionを複数設定するSectionは他のProductsやCollectionsといったページでも同じ設定をするため、Collectionを設定する同じ作業がページ分繰り返すことになってしまい、手間になってしまいます。
この手間を解消するために、1箇所でCollectionを設定して他のページでもそれが自動で反映されるような仕組みを作りたいと思ってました。
そのために試したものが、以下になります。
1. settings_schema.json からCollectionを追加する
settingsからであれば各ページから参照できると思いましたが、typeの blocks や repeater が対応していないため、これはできませんでした。
2. theme.liquid にSectionを設定する
Layoutであるtheme.liquidにCollectionを設定するSectionを追加することで設定を一つにはまとめることはできましたが、メインコンテンツである {{ content_for_layout }} の中の構造には入れ込むことができなかったので、これも残念してます。
3. 2.の方法をjsのappendChild()で任意の場所へ無理やり移動
2.の方法ではメインコンテンツの中に入れ込むことができませんでしたが、jsのappendChild()を使って移動させる方法を試みました。
Layoutに追加したCollectionを設定するのSectionを querySelector() などで要素ノード取得します。わかりやすく、ここで取得したSectionを S1 とします。
S1を任意の場所へ移動させる先となるSectionを用意します。これはTemplatesのSectionで、これも同様に querySelector() などで要素ノードを取得します。これは S2 とします。
Layoutで設定した S1 を、Templatesでメインコンテンツ内の任意の場所に置くための S2 に置くために S2.appendChild(S1); で移動させてみました。
図のような感じで実装を試みてみました。
S1はtheme.liquidに以下のようなコードを追記しています。
{%- if template == 'index' or template == 'collection' or template == 'product' -%} // Homepage,Collections,Productsだけ処理
// Collection-S1
{% section 'collection-list' %} // Collectionをblocksで設定するSection
{%- endif -%}
S2のSectionはcollection-s2.liquidとして以下のようなコードにしています。
この3.の方法は意外とうまく処理はしてくれていました。
意図した処理にはなったものの、以下のHTMLエラーの判定に引っかかってしまいました。
HTML error found
Broken HTML has been detected in your theme's sections/collection-list-to.liquid file. Check that there are no missing or extra HTML tags present.
If you haven't made changes to this code, contact support for help resolving the issue.
エラーは出ているものの通常通り動いてはくれていますが、このエラーをなんとか消したいと思っています。
上記試した方法以外で何か妙案があればご教授いただけたら幸いです。
Homeページなどで1箇所で動的に設定したSectionを、他のProductsやCollectionsといったページでも設定を保持したままSectionを追加するにはどのような方法がありますでしょうか。
