1

ショッピングカートPrestaShopのモジュールを作成しているので、システムで機能するモジュールを作成するときは、設定されたルールのフレームワークに従う必要があります。ページをリロードせずにAJAX経由でフォームを送信したいと思います。

これは、表示される内容を構築および決定するモジュールページのトリミングされたバージョンです。

<?php
    class mymodule extends Module
    {
        private $_html = '';

        // Module information
            function __construct()
            {
                // Get shop version
                    $versionMask = explode('.', _PS_VERSION_, 3);
                    $versionTest = $versionMask[0] > 0 && $versionMask[1] > 3;
                // Module info
                    $this->name  = 'MyModule';
                    $this->tab   = $versionTest ? 'administration' : 'Administration';
                    if ($versionTest) { $this->author = 'JD'; }
                    $this->version = '0';
                    parent::__construct();
                    $this->displayName = $this->l('MyModule'); 
                    $this->description = $this->l('Description...');
            }

        // Display content
            public function getContent()
            {
                $this->_displayForm();
                return $this->_html;
            }

        // Build the display
            private function _displayForm()
            {
                $this->_html .= '<script src="../modules/mymodule/scripts.js" type="text/javascript"></script>
                                <form name="formName" id="formName" method="get">
                                    <input type="submit" name="submitModule" value="Continue" />
                                </form>';
            }
    }
?>

通常、フォームデータを処理するプライベート_postProcess関数があり、ページのリロード時に関数を呼び出しますgetContent。ここで、フォームや結果などが表示されるかどうかを確認できます。

しかし、AJAXでこれを実行したいので、_postProcess必要のない関数を削除しました。scripts.jsこれは、次のような関数にリンクされています。

$(document).ready(function() {
    $('#formName').submit(function(e)
    {
        e.preventDefault();
        $.ajax({
            url: "ajax.php",
            type: "GET",
            dataType: "json",
            success: function(data)
            {
                if (data.response == 1)
                {
                    alert('true');
                }
                else
                {
                    alert('false');
                }
            }
        });
    });
});

そして、私が実際にトリミングしたajax.phpファイル自体は、結果を表示するように強制されています。

<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

しかし、私は常にエラーUncaught TypeError:nullのプロパティ'response'を読み取ることができません。これは明らかにdata.responseが何responseであるかを知らないため、正しく送信されていないことを示しています。

ページを手動でテストすると、すべてが正常に機能するので、クラスに含まれている可能性があるという事実と関係があるのではないかと思います。そして、データを送信するために通常とは異なることをしなければならないということですか?

または、PrestaShopはモジュールをAJAX経由で実行することを許可していませんが、これに関連するサイトで私が見つけることができるのは、フォーラムで同じ質問をしている人だけであり、返信/修正はありません。

また、AJAXがある程度機能していることにも注意したいと思います。成功関数に入れるalert("hello");と、アラートポップアップが表示されます。

誰かが私が間違っているかもしれないアイデアを持っていますか?

Uncaught TypeError: Cannot read property 'response' of null scripts.js:132
$.ajax.success scripts.js:132
o jquery-1.7.2.min.js:2
p.fireWith jquery-1.7.2.min.js:2
w jquery-1.7.2.min.js:4
d

scripts.js:132次の行を参照します。if (data.response == 1)

また、クラスから取り出して、通常のページ/別のディレクトリに配置し、クラス/関数内ではなく、同じコードを使用しました。

index.php

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="scripts.js" type="text/javascript"></script>
<form name="formName" id="formName" method="get">
<input type="submit" name="submitModule" value="Continue" />
</form>

scripts.js

$(document).ready(function() {
    $('#formName').submit(function(e)
    {
        e.preventDefault();
        $.ajax({
            url: "ajax.php",
            type: "GET",
            dataType: "json",
            success: function(data)
            {
                if (data.response == 1)
                {
                    alert('true');
                }
                else
                {
                    alert('false');
                }
            }
        });
    });
});

ajax.php

<?php
    $json['response'] = 1;
    echo json_encode($json);
    exit();
?>

そして、ページを送信すると、アラートがtrueになり、ajax.phpを表示すると。が表示されます{"response":1}。そのため、コード自体は問題ありません。コードをクラス/関数と統合しているだけです。

4

2 に答える 2

1

scripts.js ファイル内の ajax.php ファイルへのパスが問題を引き起こしているようです。

これは、prestashop のフォルダー構造に関係しており、すべてのモジュールは /prestashop/modules/ ディレクトリに配置されますが、モジュールは /prestashop/admin/ から表示されます。そのため、それらをフルパスに変更すると問題が解決しました。

ここで助けてくれた人たちに感謝しますが、それでも感謝しています!

于 2012-12-06T20:02:34.293 に答える
0

あなたの結果は問題なく送信されていると思いますが、JSON として解釈されず、jquerys の欠点が少しあります。あえて言います。

header('Content-Type: text/javascript; charset=utf8');

これを PHP スクリプトに入れると、そのトリックが実行され、json データの正しい解釈が強制されます。前の提案でうまくいかなかった場合は、 $.parseJson(); も試してみてください。jQueryドキュメントのように:

var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );
于 2012-12-04T22:00:34.407 に答える