1

次のコードで FB 登録プラグインを使用しています。

<html xmlns:fb="http://ogp.me/ns/fb#">

    <script type="text/javascript">
    window.fbAsyncInit = function() { FB.init({appId: 'xxx', status: true, cookie: true, xfbml: true}); };
    (function() {
        var e = document.createElement('script');
        e.async = true;
        e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
    })();
</script>

ここに私の希望するフィールドのリストがあります:

                            <?php /* There seems to be a character limit for fields causing "invalid client_id" on log in/out */?>
                        <fb:registration redirect-uri="https://xxx.secure.xxx.com/register/fb_submit.php"
                            fields='[
                            {"name":"name","view":"prefilled"},
                            {"name":"email"},
                            {"name":"password"},
                            {"name":"s_question","description":"Secret Question","type":"select","options":{"2":"In which city were you born?","4":"What is your favorite book?","3":"What is your favorite pets name?","6":"What is your favorite vacation spot?","1":"What is your mothers maiden name?"}},
                            {"name":"s_answer","type":"text","description":"Secret Answer"},
                            {"name":"first_name"},
                            {"name":"last_name"},
                            {"name":"address_co","description":"Care of (Optional)","type":"text","no_submit":true},
                            {"name":"address","description":"Mailing Address","type":"text"},
                            {"name":"address2","description":"Apartment/Unit","type":"text","no_submit":true},
                            {"name":"street_address","description":"Street Address (if using a P.O. box above)","type":"text","no_submit":true},
                            {"name":"location","view":"prefilled"},
                            {"name":"city","view":"not_prefilled","description":"City","type":"text"},
                            {"name":"state","view":"not_prefilled", "description":"State","type":"select","options":{"AA":"AA - Armed Forces Americas","AE":"AE - Armed Forces","AK":"AK - Alaska","AL":"AL - Alabama","AP":"AP - Armed Forces Pacific","AR":"AR - Arkansas","AS":"AS - American Samoa","AZ":"AZ - Arizona","CA":"CA - California","CO":"CO - Colorado","CT":"CT - Connecticut","DC":"DC - District of Columbia","DE":"DE - Delaware","FL":"FL - Florida","FM":"FM - Federated States of Micronesia","GA":"GA - Georgia","GU":"GU - Guam","HI":"HI - Hawaii","IA":"IA - Iowa","ID":"ID - Idaho","IL":"IL - Illinois","IN":"IN - Indiana","KS":"KS - Kansas","KY":"KY - Kentucky","LA":"LA - Louisiana","MA":"MA - Massachusetts","MD":"MD - Maryland","ME":"ME - Maine","MH":"MH - Marshall Islands","MI":"MI - Michigan","MN":"MN - Minnesota","MO":"MO - Missouri","MP":"MP - Northern Mariana Islands","MS":"MS - Mississippi","MT":"MT - Montana","NC":"NC - North Carolina","ND":"ND - North Dakota","NE":"NE - Nebraska","NH":"NH - New Hampshire","NJ":"NJ - New Jersey","NM":"NM - New Mexico","NV":"NV - Nevada","NY":"NY - New York","OH":"OH - Ohio","OK":"OK - Oklahoma","OR":"OR - Oregon","PA":"PA - Pennsylvania","PR":"PR - Puerto Rico","PW":"PW - Palau","RI":"RI - Rhode Island","SC":"SC - South Carolina","SD":"SD - South Dakota","TN":"TN - Tennessee","TX":"TX - Texas","UT":"UT - Utah","VA":"VA - Virginia","VI":"VI - Virgin Islands","VT":"VT - Vermont","WA":"WA - Washington","WI":"WI - Wisconsin","WV":"WV - West Virginia","WY":"WY - Wyoming"}},
                            {"name":"zip","description":"5-digit Zip Code","type":"text"},
                            {"name":"phone","description":"Phone (800-555-1212)","type":"text"},
                            {"name":"referred_by","description":"Referred by-Email or site nickname (Optional)","type":"text","no_submit":true},
                            {"name":"cert_code","description":"Gift Certificate Code (Optional)","type":"text","no_submit":true},
                            {"name":"sel_hear_about","description":"How Did You Hear About Us?","type":"select","options":{"1":"Friend","2":"Newspaper","3":"Magazine","4":"Internet Search","5":"Internet Ad","6":"Website","8":"site2","9":"site3","10":"Other","11":"TV","12":"Radio"}},
                            {"name":"hear_about","description":"newspaper/blog/website/friend name? (Optional) ","type":"text","no_submit":true},
                            {"name":"birthday"},
                            {"name":"hours","description":"Hours Spent Reading per Week (Optional)","type":"select","options":{"0":"0","1-5":"1-5","6-10":"6-10","11-20":"11-20","21-30":"21-30","31-40":"31-40","41+":"41+"},"no_submit":true}
                            ]' onvalidate="validate">
                        </fb:registration>

ここに私のvalidate()関数があります:

        function validate(form)
    {
        errors = {};
        var dt = new Date(), expiryTime = dt.setTime( dt.getTime() + 1000*5 );
        var expires = dt.toGMTString();

        if (form.first_name == "")
        {
            errors.first_name = "Please choose a First Name";
        }

        if (form.s_question == "-1")
        {
            errors.s_question = "Please choose a Secret Question";
        }
        if (form.s_answer == "")
        {
            errors.s_answer = "Please type an answer to your Secret Question";
        }
        if (form.address_co !== "")
        {
            set_cookie( 'address_co', form.address_co, expires, '/register', 'secure.xxx.com', true );
        }
        if (form.address == "")
        {
            errors.address = "Please type your mailing address";
        }
        if (form.address2 !== "")
        {
            set_cookie( 'address2', form.address2, expires, '/register', 'secure.xxx.com', true );
        }
        if (form.street_address !== "")
        {
            set_cookie( 'street_address', form.street_address, expires, '/register', 'secure.xxx.com', true );
        }
        if (form.zip == "")
        {
            errors.zip = "Please type a 5-digit Zip Code"
        }
        else if (form.zip.length != 5)
        {
            errors.zip = "Zip Code must be 5 digits";
        }
        else if (isNaN(form.zip))
        {
            errors.zip = "Zip Code must be a number";
        }


        if (form.phone == "")
        {
            errors.phone = "Please type your phone number";
        }
        if (form.referred_by !== "")
        {
            set_cookie( 'referred_by', form.referred_by, expires, '/register', 'secure.xxx.com', true );
        }
        if (form.cert_code !== "")
        {
            set_cookie( 'cert_code', form.cert_code, expires, '/register', 'secure.xxx.com', true );
        }
        if (!form.sel_hear_about)
        {
            errors.sel_hear_about = "Please choose how you heard about us";
        }
        if (form.hear_about !== "")
        {
            set_cookie( 'hear_about', form.hear_about, expires, '/register', 'secure.xxx.com', true );
        }
        if (form.hours !== "-1")
        {
            set_cookie( 'hours', form.hours, expires, '/register', 'secure.xxx.com', true );
        }

        return errors;
    }

この登録フォームにアクセスしたときに、ユーザーがすでに FB にログインしている場合、FB フィールドが入力され、フォームが機能します。ただし、ユーザーが FB にログインしておらず、 「Log in to prefill below the form below with your profile information.」というフォームで FB プロンプトを選択し、ログイン資格情報を FB に提供すると、フォームが消えて、かなり一般的なフォームに置き換えられます。 FB からの「client_id」エラー

その後、ユーザーがページを更新すると、ユーザーは FB にログインし、適切な FB フィールドが入力されます。

JSON フィールド リストを検証しました。テスト中に、フィールド リストを次のように縮小すると、次のことがわかりました。

                                fields='[
                            {"name":"name","view":"prefilled"},
                            {"name":"email"},
                            {"name":"password"},
                            {"name":"s_question","description":"Secret Question","type":"select","options":{"2":"In which city were you born?","4":"What is your favorite book?","3":"What is your favorite pets name?","6":"What is your favorite vacation spot?","1":"What is your mothers maiden name?"}},
                            {"name":"s_answer","type":"text","description":"Secret Answer"},
                            {"name":"first_name"},
                            {"name":"last_name"},                                                               ]' onvalidate="validate">

その後、エラーは発生しませんでした。最長のフィールド (上記の状態フィールド) を再度追加すると、client_id エラーが返されます。状態を追加する代わりに、他の短いフィールドの組み合わせを追加して、同じエラーを取得できます。これは、JSON フィールド リストのある種の最大サイズ制限に達していると思わせます。おそらく、FB に送信される実際の JSON ではなく、ログイン後に FB が返信する対応する非表示フィールドに含まれます。

これを修正できない場合は、基本的な FB フィールドのみを取得し、残りを別のページに移動する予定です。もちろん、フォームとサポート reg の関係から、そのままにしておくことを好みます。コードはすべて、FB データがフォームにロードされた後 (更新時) に機能します。

この長い説明にお付き合いいただきありがとうございます。

4

1 に答える 1

0

これに対する修正はありません。可能な説明のみを提供できます(いいえ、実際には最も可能性が高いと思います):

この<fb:registration>タグが行うことは、他のすべてのプラグインと同様に、基本的にページ内に iframe を作成することです。この iframe は、クエリ文字列で GET パラメータとして渡される必要なすべてのパラメータを取得します。

そのため、登録フォーム用に定義した多くのフィールドは、iframe の URL に長いクエリ文字列が含まれていることを意味します。

問題は、ブラウザーURLの可能な長さを制限していることです。

そして、Web サーバーも同様にそれを行い、「ええと、GET 経由で処理するのは少し大変です。申し訳ありませんが、申し訳ありません…」と言う前に、< /p>

そのため、登録フォームは、ユーザーがすでにログインしているときに定義された多くのフィールドで機能する可能性がありますが、iframe URL の長さはブラウザーまたは Facebook のサーバーによって適用される制限内にとどまるため、ユーザーがログインせずにログイン ボタンをクリックすると、Facebook 認証フローを介してリダイレクトされ、ログインに成功した後に「送り返す」必要がある URL (この場合はすべての GET パラメータを含む登録フォームのアドレス) が GET パラメータとして転送されます。 Auth ダイアログの URL などのパラメータ。(そして、別の URL 内の GET パラメータとして URL を送信するときに適用される必要な URL エンコーディングは、それをさらに爆破します…)

その結果、 URL が非常に長くなり、ブラウザーまたは Facebook のサーバーによって強制される制限により、これ以上送信/処理できなくなります。(Facebook からエラー メッセージが表示されているため、このシナリオでは Facebook のサーバーがエラー メッセージの処理を拒否している可能性があります。)

したがって、Facebook でバグ レポートを開くことができます。GET URL の最大長の制限を設定することで、この問題を解決できる可能性があります。しかし、彼らがこれを喜んで行うかどうかは、別の問題かもしれません. (より長いリクエスト URL を許可すると、他の意味もある可能性があるためです。)

仮にそうしたとしても、ユーザーが使用しているブラウザーで障害にぶつかる可能性があります。Internet Explorer の現在の制限が URL のパス部分の 2,048 文字のままである場合、それは、登録フォームの次の部分である可能性があります。多くのフィールドがフロントエンドで壊れます…</p>

于 2012-09-29T17:39:17.257 に答える