2012-11-20 72 views
8

這是我所得到的時候我打電話給我的Ajax請求的屏幕截圖,一個Ajax請求:如何使的Joomla組件

enter image description here

我如何只運行任務,而不打印整個頁面?這是我的Ajax調用:

$.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

你是什麼意思「沒有打印整個頁面」?要不打印任何東西?另外,你不會顯示完整的Ajax請求,它應該以})結束; 。 –

+0

看截圖。我沒有寫完整的Ajax,因爲我不認爲這很重要 – Jonuux

+0

我沒有看到預期的輸出是什麼?應該發生什麼? –

回答

28

不要去退出或死亡是,Joomla!有處理這些東西的好方法。

下面的答案在Joomla! 2.5 & 3(對於1.5也可以工作)。


一般

URL的任務需要看起來像這樣:

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

你不是創建將使用視圖控制器,假設某,其中將包含文件view.raw.html(與普通視圖文件相同)。

下面你有生成原始的HTML響應代碼:

/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"; 

注:這是解決辦法,如果我不得不返回HTML(這是更清潔和遵循的Joomla邏輯)我會使用。要返回簡單的JSON數據,請參閱下面的介紹如何將所有內容放入控制器。


如果你讓你的Ajax請求的子控制器,如:

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

比你的子控制器名稱(原始視圖)需要abc.raw.php

這也意味着您將/可能會有2個名爲Abc的子控制器。

如果返回JSON,它可能是有意義的使用format=jsonabc.json.php。在Joomla 2.5。我有一些問題得到這個選項的工作(不知何故輸出已損壞),所以我用原始。


如果您需要生成有效的JSON響應,檢查出的文檔頁面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); 

您通常會將此代碼放在控制器(你會調用一個模型,將返回您編碼的數據 - 一種非常常見的情況)。如果您需要進一步研究,還可以創建JSON視圖(view.json.php),與原始示例類似。


安全

現在Ajax請求正在工作,請不要關閉該頁面還沒有。參見下文。

不要忘記檢查請求僞造。 JSession::checkToken()在這裏派上用場。閱讀關於如何添加CSRF anti-spoofing to forms


多語種網站文檔

它可能發生,如果你沒有在發送請求的語言的名稱是,Joomla不會翻譯所需的語言字符串。

考慮以某種方式將lang param附加到您的請求中(如&lang=de)。


Joomla 3.2中的新功能! - Joomla! Ajax Interface

Joomla現在提供了一種輕量級的方式來處理插件或模塊中的Ajax請求。你可能想要使用Joomla! Ajax接口,如果您沒有組件,或者您需要從您已有的模塊發出請求。

+2

好帖子!有些事情要知道有時Joomla麻煩顯示原始的AJAX ... http://forum.joomla.org/viewtopic.php?p=1915019。出於這個原因,我不得不從我的控制器輸出我的ajax調用的輸出,而不是將它傳遞給視圖。 – Cleanshooter

+1

@Cleanshooter - 我已經添加了一些關於處理子控制器的信息。我在組件中使用了ajax,到目前爲止我還沒有遇到任何問題。如果您有任何問題,請隨時在這裏發佈一些代碼,那麼我們可以收集關於Joomla!的更多高質量信息。作品。謝謝。 –

+0

@ValentinDespa - 您的view.raw.php代碼中存在拼寫錯誤。 parrent :: display($ tpl)應該是parent :: display($ tpl)。 – mozami

0

如果您只是想將響應輸出包含在某個HTML元素中,請將format = raw追加到您的URL中,如上所述。然後,你可以有這樣的控制器功能:

function abc(){ 

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

} 

Ajax響應,你會打印輸出的一切/迴盪在控制器。