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をいたちごっこで直しても結局しかたないしね。

で、いざ本稼働を切った時に「それはできません!」となるのは本末転倒。

つーか、それした瞬間にうちのクソ部長のような風体に成り下がるだろう。

 

まぁ、またも抜本的な解決にはならないが、とりあえず思いついた方法。

  1. ページの読み込みと同時にPHPから生成されているパラメータをhttpsに書き換える
  2. 後天的に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つ目は要らないかもしれないけど・・・まぁ念のためということで。

今のところ、正常に動いてはいるので多分これで大丈夫・・・のはず。(自信はありませんが。)

カテゴリ

この記事のコメント

コメントはないです。

コメントを残す

メールアドレスが公開されることはありません。