2012-11-20 12 views
8

Ten zrzut ekranu z tego, co mam kiedy zadzwonić do mojego żądania ajax:Jak złożyć wniosek Ajax w Joomla komponent

enter image description here

Jak uruchomić tylko zadanie, bez drukowania całą stronę? To jest mój ajax połączeń:

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

Co masz na myśli mówiąc "bez drukowania całej strony"? Nie drukować niczego? Ponadto, nie pokazujesz kompletnego zapytania ajax, powinno się kończyć przez}); . –

+0

spójrz na zrzut ekranu. nie napisałem pełnego ajax, ponieważ nie sądzę, że to jest tutaj ważne – Jonuux

+0

Nie widzę, jakie jest oczekiwane wyjście? Czy w ogóle powinno się coś stać? –

Odpowiedz

28

Nie idź z wyjściem lub umrzeć Joomla! ma dobry sposób na radzenie sobie z tymi rzeczami.

Poniższe odpowiedzi są testowane w Joomla! 2.5 & 3 (dla 1.5 może również działać).


Ogólne

Twój URL dla zadania musi wyglądać następująco:

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

Ty niż stworzyć kontroler, który będzie korzystał z widoku, powiedzmy Abc , który będzie zawierał plik view.raw.html (identyczny z normalnym plikiem widoku).

Poniżej masz kod wygeneruje surową odpowiedź 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"; 

Uwaga: Jest to rozwiązanie użyłbym, gdybym musiał wrócić HTML (jest czystsze i następuje logikę Joomla). Aby uzyskać proste dane JSON, zobacz poniżej, jak umieścić wszystko w kontrolerze.


Jeśli się żądania Ajax do subcontroller, jak:

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

niż nazwy subcontroller (dla surowej widzenia) musi być abc.raw.php.

Oznacza to również, że będziesz/może mieć 2 kontrolery podrzędne o nazwie Abc.

Jeśli zwrócisz JSON, może być użyteczne użycie format=json i abc.json.php. W Joomla 2.5. Miałem pewne problemy z działaniem tej opcji (w jakiś sposób wynik był uszkodzony), więc użyłem surowca.


Jeśli trzeba wygenerować poprawną odpowiedź JSON, sprawdź stronę docs 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ędziesz zazwyczaj umieścić ten kod w kontroler (można nazwać model, który powróci dane, które kodujesz - bardzo często spotykany scenariusz). Jeśli chcesz zrobić to dalej, możesz także utworzyć widok JSON (view.json.php), podobny do surowego przykładu.


Bezpieczeństwo

teraz, że żądanie Ajax pracuje, nie zamykaj jeszcze stronę. Czytaj poniżej.

Nie zapomnij sprawdzić dla zapytania fałszerstwa. JSession::checkToken() przydać się tutaj. Zapoznać się z dokumentacją, w jaki sposób dodać CSRF anti-spoofing to forms


wielojęzycznych witryn

Może się zdarzyć, że jeśli nie wysyłają nazwy języka w żądaniu, Joomla nie przełoży sznurki język, którego chcesz .

Zastanów się nad dołączeniem w jakiś sposób param do swojej prośby (np. &lang=de).


Nowości w Joomla 3.2! - Joomla! Ajax Interface

Joomla teraz zapewnia lekki sposób obsługi żądania Ajax w wtyczce lub module. Możesz użyć Joomla! Interfejs Ajax, jeśli nie masz już komponentu lub jeśli chcesz wysyłać żądania z modułu, który już posiadasz.

+2

Świetny post! Coś, o czym warto pamiętać, czasami Joomla ma problemy z wyświetlaniem surowca dla ajax ... http://forum.joomla.org/viewtopic.php?p=1915019. Miałem do echo wyjście z mojego kontrolera dla moich wywołań ajax, zamiast przekazywania go do widoku z tego właśnie powodu. – Cleanshooter

+1

@Cleanshooter - Dodałem trochę informacji na temat radzenia sobie z kontrolerami podrzędnymi.Używam ajaxa całkiem sporo w moich komponentach i jak dotąd nie miałem żadnych problemów z zajmowaniem się tymi rzeczami. Jeśli masz jakieś problemy, zapisz tutaj kod, co nie działa, abyśmy mogli zebrać więcej informacji o jakości Joomla! Prace. Dzięki. –

+0

@ValentinDespa - W twoim kodzie view.raw.php jest literówka. parrent :: display ($ tpl) powinien być rodzicem :: display ($ tpl). – mozami

0

Jeśli chcesz dołączyć wyniki odpowiedzi do jakiegoś elementu HTML, dopisz format = raw do swojego adresu URL, jak wspomniano powyżej. Wtedy można mieć funkcję kontrolera takiego:

function abc(){ 

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

} 

Odpowiedź AJAX wyświetli wszystko, co drukowane/echem w kontrolerze.

Powiązane problemy