2012-11-20 43 views
8

Đây là một ảnh chụp màn hình của những gì tôi nhận được khi tôi gọi yêu cầu ajax của tôi:Làm thế nào để thực hiện một yêu cầu Ajax trong Joomla Component

enter image description here

Làm thế nào để chỉ chạy các nhiệm vụ, mà không cần in toàn bộ trang? Đây là cuộc gọi ajax của tôi:

$.ajax 
({ 
type: "POST", 
url: "index.php?option=com_similar&task=abc", 
    data: { 
     id: id, 
     name: name, 
     similar_id: similar_id, 
    }, 
cache: false, 
success: function(html) 
{ 
$("#flash").fadeOut("slow"); 
$("#content"+similar_id).html(html); 
} 
}); 
}); 

$(".close").click(function() 
{ 
$("#votebox").slideUp("slow"); 
}); 

}); 
+1

Bạn có ý nghĩa gì với "không in toàn bộ trang"? Để không in bất cứ thứ gì? Ngoài ra, bạn không hiển thị yêu cầu ajax hoàn chỉnh của bạn, nó sẽ kết thúc bằng}); . –

+0

xem ảnh chụp màn hình. tôi đã không viết ajax đầy đủ, bởi vì tôi không nghĩ rằng đây là quan trọng ở đây – Jonuux

+0

Tôi không thấy những gì đầu ra dự kiến ​​là? Nên anyting xảy ra ở tất cả? –

Trả lời

28

Đừng đi với exit or die, Joomla! có cách xử lý tốt với công cụ này.

Các câu trả lời dưới đây được kiểm tra trong Joomla! 2.5 & 3 (đối với 1.5. Cũng có thể hoạt động).


chung

URL của bạn cho nhiệm vụ cần phải trông như thế này:

index.php?option=com_similar&task=abc&format=raw

Bạn hơn tạo ra bộ điều khiển mà sẽ sử dụng xem, giả sử Abc , sẽ chứa tệp view.raw.html (giống với tệp xem bình thường).

Dưới đây bạn có mã cho tạo ra một phản ứng HTML liệu:

/controller.php

public function abc() 
{ 
    // Set view 
    JRequest::setVar('view', 'Abc'); 
    parent::display(); 
} 

/views/abc/view.raw.php

<?php 
defined('_JEXEC') or die; 

jimport('joomla.application.component.view'); 

class SimilarViewAbc extends JView 
{ 
    function display($tpl = null) 
    { 
     parent::display($tpl); 
    } 
} 

/views/abc/tmpl/default.php

<?php 

echo "Hello World from /views/abc/tmpl/default.php"; 

Lưu ý: Đây là giải pháp tôi sẽ sử dụng nếu tôi phải trả lại HTML (nó sạch hơn và tuân theo logic Joomla). Để trả về dữ liệu JSON đơn giản, hãy xem bên dưới cách đặt mọi thứ trong bộ điều khiển.


Nếu bạn thực hiện yêu cầu Ajax của bạn đến một subcontroller, như:

index.php?option=com_similar&controller=abc&format=raw

Thần tên subcontroller của bạn (cho xem liệu) cần phải được abc.raw.php.

Điều này cũng có nghĩa là bạn sẽ/có thể có 2 điều khoản con có tên là Abc.

Nếu bạn trả về JSON, bạn có thể sử dụng format=jsonabc.json.php. Trong Joomla 2.5. Tôi đã có một số vấn đề nhận được tùy chọn này để làm việc (bằng cách nào đó đầu ra đã bị hỏng), vì vậy tôi sử dụng nguyên.


Nếu bạn cần tạo ra một JSON phản ứng hợp lệ, hãy kiểm tra các trang tài liệu Generating JSON output

// We assume that the whatver you do was a success. 
$response = array("success" => true); 
// You can also return something like: 
$response = array("success" => false, "error"=> "Could not find ..."); 

// Get the document object. 
$document = JFactory::getDocument(); 

// Set the MIME type for JSON output. 
$document->setMimeEncoding('application/json'); 

// Change the suggested filename. 
JResponse::setHeader('Content-Disposition','attachment;filename="result.json"'); 

echo json_encode($response); 

Bạn thường sẽ đặt mã này trong bộ điều khiển (bạn sẽ gọi cho một mô hình mà sẽ trở lại dữ liệu bạn mã hóa - một tình huống rất phổ biến). Nếu bạn cần tiếp tục, bạn cũng có thể tạo một khung nhìn JSON (view.json.php), tương tự như ví dụ thô.


an

Bây giờ yêu cầu Ajax đang làm việc, không đóng trang được nêu ra. Đọc dưới đây.

Đừng quên kiểm tra mật khẩu yêu cầu. JSession::checkToken() có ích ở đây. Đọc tài liệu trên Làm thế nào để thêm CSRF anti-spoofing to forms


trang web đa ngôn ngữ

Có thể xảy ra nếu bạn không gửi tên ngôn ngữ trong yêu cầu, Joomla sẽ không dịch các chuỗi ngôn ngữ bạn muốn .

Cân nhắc việc thêm tham số lang theo yêu cầu của bạn bằng cách nào đó (như &lang=de).


Mới trong Joomla 3.2! - Joomla! Ajax Interface

Joomla hiện cung cấp một cách nhẹ để xử lý yêu cầu Ajax trong plugin hoặc mô-đun. Bạn có thể muốn sử dụng Joomla! Giao diện Ajax nếu bạn chưa có một thành phần hoặc nếu bạn cần thực hiện các yêu cầu từ một mô-đun mà bạn đã có.

+2

Bài đăng tuyệt vời! Một cái gì đó để được nhận thức của đôi khi Joomla có rắc rối với màn hình hiển thị nguyên cho ajax ... http://forum.joomla.org/viewtopic.php?p=1915019. Tôi đã có để echo đầu ra từ bộ điều khiển của tôi cho các cuộc gọi ajax của tôi thay vì đi qua nó để xem vì lý do này rất. – Cleanshooter

+1

@Cleanshooter - Tôi đã thêm một số thông tin về giao dịch với các điều khoản con.Tôi sử dụng ajax khá nhiều trong các thành phần của tôi và cho đến nay tôi đã không có bất kỳ vấn đề đối phó với công cụ này. Nếu bạn gặp bất kỳ vấn đề nào, hãy đăng một số mã ở đây những gì không hoạt động để chúng tôi có thể thu thập thông tin chất lượng hơn về cách Joomla! công trinh. Cảm ơn. –

+0

@ValentinDespa - Có lỗi đánh máy trong mã view.raw.php của bạn. parrent :: display ($ tpl) phải là parent :: display ($ tpl). – mozami

0

Nếu bạn chỉ muốn bao gồm đầu ra phản hồi trong một số phần tử HTML, hãy thêm định dạng = raw vào URL của bạn như đã đề cập ở trên. Sau đó, bạn có thể có chức năng điều khiển như sau:

function abc(){ 

//... handle the request, read variables, whatever 
print "this is what I want to place in my html"; 

} 

Phản hồi AJAX sẽ in mọi thứ bạn in/lặp lại trong bộ điều khiển.

Các vấn đề liên quan