it-mot-dan-vi.com

Đơn giản AJAX gọi đến một thành phần gây ra lỗi 403 (Bị cấm)

Tuyên bố miễn trừ trách nhiệm: Tôi khá mới đối với Joomla và phát triển web, vì vậy tôi có thể đang mắc một sai lầm ngớ ngẩn cho người mới bắt đầu. Cho đến nay tôi đã làm việc với phần lớn hướng dẫn MVC trong tài liệu Joomla và tôi đã đọc câu trả lời cho Cách thích hợp để tạo AJAX gọi trong thành phần? câu hỏi, nhưng tôi vẫn gặp sự cố.

Tôi đang sửa đổi một thành phần hiện có (J2Store) vì vậy tôi không sử dụng com_ajax. Tôi muốn một tập lệnh JavaScript có thể sử dụng một phương thức trong một bộ điều khiển con (com_j2store/controls/products.php) để lấy dữ liệu. Trong lớp điều khiển con của tôi, tôi có một phương thức giả để kiểm tra điều này:

trang web/thành phần/com_j2store/bộ điều khiển/sản phẩm.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";
  }

}

Dựa trên những gì tôi đã đọc, tôi đã cùng nhau tìm hiểu sau AJAX gọi:

trang web/mẫu/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); 
    }
  });

  ...
}

(Đây là dự án tôi đã kế thừa và nhà phát triển trước đó đã lựa chọn tạo và đặt mã vào tệp mẫu user.js. Tôi cũng đang đặt mã của mình vào tệp này vì tôi đang sửa đổi những gì anh ta đã làm.)

Điều tôi mong đợi sẽ xảy ra khi tôi kích hoạt cuộc gọi AJAX là một cửa sổ cảnh báo bật lên và nói "một cái gì đó". Tuy nhiên, khi cuộc gọi AJAX được kích hoạt bảng điều khiển ghi lại lỗi 403 (Bị cấm) và số dòng mà nó đưa ra thực sự là số dòng của cuộc gọi AJAX.

Vì sự thiếu kinh nghiệm của tôi và có bao nhiêu khía cạnh khác nhau liên quan đến vấn đề này, thật khó để tôi biết điều gì gây ra vấn đề. Đặc biệt tôi không biết liệu tôi đã cấu trúc mã của mình không chính xác trong cấu trúc Joomla hay nếu cuộc gọi AJAX của tôi là sai. Hy vọng ai đó có thể giúp làm rõ mọi thứ cho tôi.

update mixahlos đã chỉ ra rằng url cũ của tôi "index.php? tùy chọn = com_j2store & format = raw & control = Products & task = doS Something" không chính xác, nhưng tôi vẫn gặp lỗi

2
William

Khi bạn mới bắt đầu phát triển một thành phần j Joomla, bạn thực sự có một công việc nặng nhọc ngay lập tức. J2Store là một thành phần được xây dựng khá tốt (tôi thích nó và sử dụng nó), tuy nhiên nó được xây dựng bằng cách sử dụng FOF (và trên hết, với FOF cũ và bởi một anh chàng nhà phát triển khá tiên tiến). Vì vậy, bạn sẽ có một vài điều bổ sung để nghiên cứu và một chút đau đầu quá (mãn tính :)).

Tôi chưa kiểm tra các mục sau nhưng theo như tôi biết thành phần này, hãy thử tạo url cuộc gọi ajax của bạn như thế này:

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

Điều này sẽ thực hiện cuộc gọi cần thiết đến chức năng của bộ điều khiển J2Store được nhắm mục tiêu theo tôi, ngay cả khi nó không giống như vậy. Hãy cho tôi một số thông tin phản hồi.

... vẫn đang kiểm tra các cuộc gọi trên Máy chủ cục bộ ...

Nếu bạn chạy Joomla của bạn trên localhost, thì tốt hơn là sử dụng url trong cuộc gọi bằng cách mở dấu gạch chéo ngược, như:

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

Đầu tiên, việc đặt và kiểm tra hàm doS Something () bên trong hàm bộ điều khiển gọi lại J2Store class (callback.php) không phải là ý tưởng tồi cho các cuộc gọi ajax như tôi thấy. Bạn sẽ tìm thấy lớp này trong số các bộ điều khiển thành phần.

class J2StoreControllerCallback extends F0FController
{
}

Nếu tôi gọi một hàm ở đây trong lớp này với url ở trên, thì tôi đã nhận được 200 OK phản hồi. Và như tôi thấy, trong lớp này, bảo vệ csrf cũng bị tắt, điều này cũng có thể giúp bạn thực hiện các cuộc gọi ajax thành công. Những điều thú vị ...

Vì vậy, tôi đặt tập lệnh gọi ajax sau vào thành phần/com_j2store/samples/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>

Tôi cũng chỉ đặt một nút trong cùng một tệp mẫu này (trong div hàng đầu ở đâu đó) để kiểm tra cuộc gọi ajax:

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

Mẫu trên là mẫu danh sách sản phẩm chính của cửa hàng. Vì vậy, cuộc gọi ajax được thực hiện ở đây, tuy nhiên vẫn còn nhiều thử nghiệm nên được thực hiện, từ đâu và đến lớp nào các cuộc gọi ajax nên được thực hiện và một vài điều khác ... Tôi chỉ hy vọng bạn có thể làm theo điều này.

Bây giờ, chỉ để thực sự đóng câu hỏi này, chúng ta có một cuộc gọi ajax thành công đến một trong những bộ điều khiển J2Store (callback.php) ngay lập tức kiểm tra cuộc gọi và chuyển hướng cuộc gọi đến Model (thành phần/com_j2store/model/callback.php), Model nào nhận được cuộc gọi và kiểm tra xem nó có bất kỳ $ method tương ứng, được định nghĩa trong lớp này, giống như trong phương thức được định nghĩa trong cuộc gọi ajax. Vì vậy, tôi đã đặt hàm doS Something () ở dưới cùng của lớp mô hình gọi lại này (model/callback.php):

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

Và trong mô hình gọi lại này Hàm của Class: hàm runCallback ($ method) {} Tôi đã chèn 3 lớp lót nếu kiểm tra tại dòng 23, trông như thế này:

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

Và bây giờ hàm doS Something () của tôi đang chạy và tôi nhận được bất kỳ phản hồi nào tôi xác định trong hàm doS Something () của mình. Vì vậy, đây là cách các cuộc gọi ajax sẽ hoạt động trong một MVC được cấu trúc theo cách này với FOF.

2
Zollie

Có vẻ như url trong cuộc gọi Ajax của bạn là sai. Bạn không nên sử dụng bộ điều khiển như một var trong url mà là tiền tố theo sau bởi tác vụ. Ngoài ra sau "?" đi tùy chọn và sau đó phần còn lại của url url.

Cố gắng thay thế:

url: "index.php? format = raw & option = com_j2store & controller = Products & task = doS Something",

Với

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