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つ目は要らないかもしれないけど・・・まぁ念のためということで。
今のところ、正常に動いてはいるので多分これで大丈夫・・・のはず。(自信はありませんが。)
