Shopify Chrome Extension for Admin

时间:2016-02-21 07:42:54

标签: json ajax google-chrome-extension shopify

我尝试创建一个扩展程序,在shopify的管理产品页面中添加2个字段,以便添加元数据。

我知道那里有一些扩展,比如ShopifyFD和CustomFields,但我的确非常非常简单,我绝不会试图复制它,这对我的shopify商店来说非常习惯。

我想要的只是向页面添加2个特定的元字段,并在单击按钮保存时保存。

那就是说,一切都已经有效了,但我在POST / PUT期间遇到了问题。它保持返回状态' 303 See Other' 并将我重定向到登录,这是我在开头引用的两个扩展中都没有遇到的行为。我想知道我使用的方法是问题还是其他问题,所以我可以为您提供帮助。

这里的标题如何:

Request URL:https://mywebsite.myshopify.com/admin/products/461395295/metafields/9911129091.json
Request Method:PUT
Status Code:303 See Other
Remote Address:23.227.38.70:443

就像我提到的那样,我使用了不同的方法ShopifyFD或CustomFields,而不是加载脚本,我使用内容脚本。

这里我的清单如何:

   "content_scripts": [
        {
            "all_frames": true,
            "matches": [
                "https://*.myshopify.com/admin/products/*"
            ],
            "run_at": "document_end",
            "js": [
                "scripts/vendors/jquery.js",
                "scripts/vendors/handlebars-v3.0.0.js",
                "scripts/vendors/handlebars-helpers.js",
                "scripts/utils.js",
                "scripts/shopify-product-addon.js"
            ]
        }
    ]

1 - 我用新的替换当前的Save按钮,这样我就可以在提交本机表单之前保存元字段 2 - 我将POST / PUT方法附加到我已替换的新保存按钮

这里我的帖子/看起来如何:

注意:记录是我保存的值。

            var metaJSON;

            if (record.update) {
                metaJSON = {
                    'metafield': {
                        'id': record.metafield_id,
                        'value': record.value,
                        'value_type': record.value_type
                    }
                }

                method = 'PUT';
                url = '/admin/' + route_url + '/metafields/' + record.metafield_id + '.json';
            } else {
                metaJSON = {
                    'metafield': {
                        'namespace': record.namespace,
                        'key': record.key,
                        'value': record.value,
                        'value_type': record.value_type
                    }
                };


                url = '/admin/' + route_url + '/metafields.json';
                method = 'POST';
            }

            $.ajax({
                type: method,
                url: url,
                data: metaJSON,
                dataType: 'json',
                success: function(d) {
                  console.log('SUCCESS');
                },
                error: function(d) {
                    console.log('ERROR');           
                }
            });

问题在于它每次都失败了。我想知道出了什么问题。我正在使用的方法是什么?

我正在做ShopifyFD,就像发布/放入ajax api一样,只是不确定缺少什么。我发现的唯一区别是ShopifyFD上有一个cookie设置为 request_method = PUT request_method = POST 。我不知道这个cookie是如何设置的,因为它不在脚本上。我甚至尝试手动设置它,但它不起作用。

正如你所看到的,我已经尝试了很多东西。

还有其他人有其他建议吗?! :P

由于

1 个答案:

答案 0 :(得分:0)

我没有弄清楚为什么ShopifyFD会起作用,我真的很想了解你,但我找到了另一种让它工作的方法。

您需要在请求标头之前设置CSRF令牌。

像魅力一样!

$.ajax({
    type: method,
    url: url,
    data: metaJSON,
    beforeSend: function (request) {
        var token = $("meta[name=csrf-token]").attr('content');
        request.setRequestHeader("X-CSRF-Token", token);
    },
    .
    .
    .