web-dev-qa-db-ja.com

単純なAJAXコンポーネントの呼び出しで403(禁止)エラーが発生する

免責事項:私はJoomlaとWeb開発にかなり慣れていないので、多分、初心者の愚かな間違いを犯しています。これまでのところ、Joomlaのドキュメントで MVCチュートリアル の大部分を処理し、- AJAXコンポーネントを呼び出しますか? 質問ですが、まだ問題が解決しません。

既存のコンポーネント(J2Store)を変更しているので、com_ajaxは使用していません。 JavaScriptスクリプトがサブコントローラー(com_j2store/controllers/products.php)のメソッドを使用してデータを取得できるようにしたいのですが。私のサブコントローラークラスには、これをテストするためのダミーメソッドがあります。

site/components/com_j2store/controllers/products.php

<?php
/**
 * @package J2Store
 * @copyright Copyright (c)2014-17 Ramesh Elamathi / J2Store.org
 * @license GNU GPL v3 or later
 */
// No direct access to this file
use Joomla\Registry\Format\Json;

defined('_JEXEC') or die;

require_once(JPATH_ADMINISTRATOR.'/components/com_j2store/controllers/productbase.php');
class J2StoreControllerProducts extends J2StoreControllerProductsBase
{
...

  // My method
  public function doSomething(){
    echo "something";
  }

}

読んだ内容に基づいて、次のようにまとめましたAJAX呼び出し:

site/templates/my_template/js/user.js

// menu select options

jQuery(document).ready(function() {
  ...

  jQuery.ajax({
    url: "index.php?option=com_j2store&format=raw&task=products.doSomething", 
    type: "GET",
    success: function(response){ 
      alert(response); 
    }
  });

  ...
}

(これは私が継承したプロジェクトであり、以前の開発者がコードを作成してuser.jsテンプレートファイルに配置することを選択しました。私は自分のコードをこのファイルにも配置しています。彼が行ったことを変更しているためです。)

AJAXの呼び出しをトリガーしたときに起こると予想されることは、警告ウィンドウがポップアップして「何か」と言っていることです。しかし、AJAXの呼び出しがトリガーされたとき、コンソール403(Forbidden)エラーをログに記録し、エラーが示す行番号は、AJAX呼び出しの行番号です。

私の経験が浅く、この問題にはさまざまな側面が含まれているため、問題の原因を知るのは困難です。特に、Joomla構造でコードを誤って構造化したのか、またはAJAXの呼び出しが間違っているのかどうかはわかりません。うまくいけば、誰かが私にわかりやすく説明してくれるでしょう。

updatemixahlosは、私の古いURL "index.php?option = com_j2store&format = raw&controller = products&task = doSomething"が正しくないことを指摘しましたが、それでも取得していますエラー

2
William

Joomlaコンポーネントの開発を開始すると、すぐに本当に大変な仕事に取り掛かりました。 J2Storeは非常によく構築されたコンポーネントです(私はそれが好きでそれを使用しています)が、FOFを使用して構築されています(さらにその上、古いFOFを使用し、かなり高度な開発者が開発しています)。だから、あなたは勉強する追加の事柄がほとんどなく、少し頭痛の種もあるでしょう(慢性:))。

私はまだ以下をテストしていませんが、このコンポーネントを知っている限り、次のようにajax呼び出しURLを作成してみてください。

url: 'index.php?option=com_j2store&view=products&task=doSomething',

これにより、たとえそれがそのように見えなくても、ターゲットのJ2Storeコントローラー関数に必要な呼び出しが行われるはずです。フィードバックをお願いします。

...ローカルホストでの呼び出しをまだテストしています...

Joomlaを実行する場合 localhostの場合、次のようにバックスラッシュを開いて呼び出しでURLを使用することをお勧めします。

url: '/index.php?option=com_j2store&view=callback&task=callback&method=doSomething',

まず、このコンポーネントは主にこのクラスを使用しているため、J2Storeコールバックコントローラークラス(callback.php)内にdoSomething()関数を配置してテストすることは悪い考えではありません私が見るようにajax呼び出しのために。このクラスはコンポーネントコントローラーの中にあります。

class J2StoreControllerCallback extends F0FController
{
}

上記のURLを使用してこのクラスの関数を呼び出すと、200 OK応答が返されます。そして、私が見るように、このクラスでは、csrf保護もオフになっているため、ajax呼び出しの成功にも役立ちます。面白いこと...

したがって、次のajax呼び出しスクリプトをcomponents/com_j2store/templates/default/default.php

<script type="text/javascript">
     $ = jQuery.noConflict();        
        $(document).ready(function() {
            $('#mybutton2').on('click', function() {
                $.ajax({
                    url: '/index.php?option=com_j2store&view=callback&task=callback&method=doSomething',
                    cache: false,
                    type: 'GET',                        
                    success: function(data) {
                        alert('its good');
                        console.log(data);
                    },
                    error: function(){
                        console.log('its not working');
                    },
                });
            });
        });

</script>

私はまた、ajax呼び出しをテストするために、同じテンプレートファイル(上部のdivのどこかに)にボタンを配置しました。

<div>
     <button class="btn btn-primary" type="button" id="mybutton2">MyButton</button>
</div>

上記のテンプレートは、ショップのメインの商品リストテンプレートです。したがって、ajax呼び出しはここを通過しますが、どのクラスからどこにajax呼び出しを行う必要があるか、およびその他のいくつかのことから、まだ多くのテストを実行する必要があります...これに従ってください。

さて、この質問を本当に閉じるために、J2Storeコントローラー(callback.php)の1つに成功したajax呼び出しを呼び出します。これは、呼び出しをすぐにチェックして、呼び出しをModel (components/com_j2store/models/callback.php)、このモデルは呼び出しを受け取り、対応する$ methodがあるかどうかを確認します。対応する、このクラスで定義されています。 ajax呼び出し。したがって、このコールバックモデルクラス(models/callback.php)の下部にdoSomething()関数を配置しました。

function doSomething() 
{
        $mymessage = 'this is from the callback function';
        echo new JResponseJson($mymessage);
        $status = true;
        return $status;
}

そして、このコールバックモデルのクラスの関数:function runCallback($ method){} 23行目に3ライナーチェックする場合を挿入しました。

if ($rawDataGet['method'] == 'doSomething')
{
    $this->doSomething();
    return true;
}

そしてmy doSomething()関数が実行され、doSomething()関数で定義した応答を取得します。したがって、これは、FOFでこのように構成されたMVC内でajax呼び出しが機能する方法です。

2
Zollie

Ajax呼び出しのURLが間違っているようです。コントローラーをurlのvarとして使用するのではなく、タスクの前に付けるプレフィックスとして使用してください。 「?」の後もオプションになり、残りのURL変数が続きます。

交換してみてください:

url: "index.php?format = raw&option = com_j2store&controller = products&task = doSomething"、

url: "index.php?option=com_j2store&format=raw&task=products.doSomething",
1
mixahlos