Magento2のStore View、Wishlist、Compareのパラメータ
やられた・・・。こちらの記事でStore View問題はとりあえずのところで解決したが、やはり他にもパラメータは残っていた。
Store Viewはもちろんのこと、Wishlist、Compare・・・探せば切りがない。
Magento2はいたるところにこのパラメータ形式でデータのやり取りを行わせている。
しかも、なぜかサイトをフルSSL化しておくと、テンプレートから書き出されるページ本体にも、
data-post="{"action":"http:~略 data-post="{"action":"https:~略
これらが、混在してしまう。
これは実に由々しき事態だ。Store Viewのテンプレートを直したからといって解決できる問題ではない。
やはり前回の対応は、その場限りの応急処置だった。
直そうにも、まだMagento2の構成に足を踏み入れたばかりのレベル。
実力も不確かな俺にそれを抜本的に直せる方法はない。
しかも、よくよく調べてみるとJavascriptで動的に書き出している部分もある状態・・・一体どうしろとww
PHPクラス側のパラメータ生成元とJavascript側の生成元のURL参照先を直せば、多分それで済む話なのだが・・・。
その場所は現在も捜索中・・・いい加減に飽きてきた。
テンプレート用のphtmlをいたちごっこで直しても結局しかたないしね。
で、いざ本稼働を切った時に「それはできません!」となるのは本末転倒。
つーか、それした瞬間にうちのクソ部長のような風体に成り下がるだろう。
まぁ、またも抜本的な解決にはならないが、とりあえず思いついた方法。
- ページの読み込みと同時にPHPから生成されているパラメータをhttpsに書き換える
- 後天的にJavascriptでパラメータが生成される箇所は、押下と同時にhttpsへすり替える
以上の二重策。
前回対応したlanguage.htmlを削除して下記にソースコードにいろいろ変えた。
読み込みと同時にパラメータを書き換え
子テーマ側に上書き用ディレクトリを作成して、cookie.phtmlを以下のように設定。
<script> // プロトコル保持変数 var public_protcol = (document.location.protocol == 'https:') ? true : false ; </script> <script type="text/x-magento-init"> // cookie.phtmlが最初から持ってるコード { "*": { "mage/cookies": { "expires": null, "path": "<?php /* @escapeNotVerified */ echo $block->getPath()?>", "domain": "<?php /* @escapeNotVerified */ echo $block->getDomain()?>", "secure": false, "lifetime": "<?php /* @escapeNotVerified */ echo $block->getLifetime()?>" } } } </script> <script> //ページ読み込みと同時に該当箇所を書き換え require(['jquery', 'jquery/ui'], function($){ if(public_protcol){ $(document).ready(function(){ $('*[data-post*="http:"], a.action[href*="http:"]').each(function(e){ try{ var str var tar = ($(this).prop('tagName') == 'a') ? 'href' : 'data-post'; str = $(this).attr(tar); str = str.replace(/http:/g, 'https:'); $(this).attr(tar, str); }catch(e){} }); }); } }); </script>
後天的にパラメータが付与される部分のすり替え
ライブラリのpostData.jsを直接変更する。※要バックアップ
define([ "jquery", "mage/template", "jquery/ui" ], function($,mageTemplate){ $.widget('mage.dataPost', { options: { formTemplate: '<form action="<%- data.action %>" method="post">' + '<% _.each(data.data, function(value, index) { %>' + '<input name="<%- index %>" value="<%- value %>">' + '<% }) %></form>', postTrigger: ['a[data-post]', 'button[data-post]', 'span[data-post]'], formKeyInputSelector: 'input[name="form_key"]' }, _create: function() { this._bind(); }, _bind: function() { var events = {}; $.each(this.options.postTrigger, function(index, value) { events['click ' + value] = '_postDataAction'; }); this._on(events); }, _postDataAction: function(e) { e.preventDefault(); //↓追加文 ここから try{ if(public_protcol){ var str = $(e.currentTarget).attr('data-post'); str = str.replace(/http:/g, 'https:'); $(e.currentTarget).attr('data-post', str); } }catch(e){} //↑追加文 ここまで var params = $(e.currentTarget).data('post'); this.postData(params); }, postData: function(params) { var formKey = $(this.options.formKeyInputSelector).val(); if (formKey) { params.data.form_key = formKey; } $(mageTemplate(this.options.formTemplate, { data: params })).appendTo('body').hide().submit(); } }); $(document).dataPost(); return $.mage.dataPost; });
恐らく2つ目のコード群さえ入れておけば、恐らく1つ目は要らないかもしれないけど・・・まぁ念のためということで。
今のところ、正常に動いてはいるので多分これで大丈夫・・・のはず。(自信はありませんが。)