Tworzę niestandardowy komponent dla Joomla! 3.x i chcesz wykonać wywołanie AJAX w celu pobrania niektórych danych. Jaki jest właściwy sposób to zrobić?
component
ajax
development
joomla-3.x
Dmitry Rekun
źródło
źródło
Odpowiedzi:
Abstrakcyjny
Prawie nie ma naprawdę oficjalnego sposobu radzenia sobie z tym, to zależy od złożoności i od tego, jak bardzo chcesz polegać na wzorcu MVC.
Poniżej znajduje się kilka możliwych rozwiązań, które powinny działać w Joomla 2.5 i 3.x. Kod nie jest prezentowany dla zadania kopiowania-wklejania, ale jako ogólny pomysł.
Przed Joomla! 3,2 jedyną rzeczą, którą należy użyć poniższych przykładów jest
component
. Po Joomla 3.2 (dla mniej złożonych zadań) możesz obsługiwać żądania z modułów i wtyczek.Ogólna odpowiedź HTML (zgodnie ze starszym MVC)
Twój adres URL zadania musi wyglądać następująco:
index.php?option=com_similar&task=abc&format=raw
Abc
Następnie tworzysz kontroler, który będzie korzystał z widoku, powiedzmy , który będzie zawierał plik view.raw.html (identyczny z normalnym plikiem widoku).Poniżej masz kod do generowania surowej odpowiedzi HTML:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Uwaga: jest to rozwiązanie, którego użyłbym, gdybym musiał zwrócić HTML (jest czystszy i postępuje zgodnie z logiką Joomla). Aby zwrócić proste dane JSON, zobacz poniżej, jak umieścić wszystko w kontrolerze.
Podwykonawcy
Jeśli przesyłasz żądanie Ajax do podwykonawcy , na przykład:
index.php?option=com_similar&controller=abc&format=raw
Nazwa twojego podwykonawcy (dla surowego widoku) musi być
abc.raw.php
.Oznacza to również, że będziesz / mógł mieć 2 subskrybentów o nazwie Abc.
Jeśli zwrócisz JSON, warto użyć
format=json
iabc.json.php
. W Joomla 2.5. Miałem pewne problemy z uruchomieniem tej opcji (jakoś wynik był uszkodzony), więc użyłem raw.Prawidłowa odpowiedź JSON (w związku z nowym / starszym MVC)
Jeśli chcesz wygenerować prawidłową odpowiedź JSON , sprawdź stronę z dokumentami Generowanie danych wyjściowych JSON
Zazwyczaj umieszczasz ten kod w kontrolerze (wywołujesz model, który zwróci kodowane dane - bardzo częsty scenariusz). Jeśli chcesz pójść dalej, możesz również utworzyć widok JSON (view.json.php), podobny do surowego przykładu.
Bezpieczeństwo
Teraz, gdy żądanie Ajax działa, nie zamykaj jeszcze strony. Czytaj poniżej.
Nie zapomnij sprawdzić fałszywych zapytań.
JSession::checkToken()
przydaj się tutaj. Przeczytaj dokumentację na temat dodawania funkcji CSRF do fałszowania formularzyWitryny wielojęzyczne
Może się zdarzyć, że jeśli nie wyślesz nazwy języka we wniosku, Joomla nie przetłumaczy żądanych ciągów językowych.
Zastanów się, czy w jakiś sposób nie dołączyć do swojego żądania lang param (jak
&lang=de
).Joomla! Interfejs Ajax
Nowości w Joomla 3.2! - umożliwiło wykonywanie żądań obsługi bez budowania komponentu
Joomla! Interfejs Ajax - Joomla zapewnia teraz lekki sposób obsługi żądania Ajax we wtyczce lub module. Możesz użyć Joomla! Interfejs Ajax, jeśli nie masz jeszcze komponentu lub jeśli chcesz wysyłać żądania z modułu, który już masz.
źródło
JRequest
? Jest przestarzałe, czy powinno to być po prostu,$this->input
ponieważ używam v3.x?JRequest
. DziękiValid JSON Response
rozdziale.To późna odpowiedź na to pytanie, na które bardzo dobrze odpowiedziano, ale chciałem dodać to bezpośrednie rozwiązanie dla tych, którzy potrzebują prostego sposobu na uzyskanie dostępu do danych swoich komponentów za pomocą wywołania AJAX.
Ze wszystkimi wersjami Joomla, możliwościami stron trzecich i hackami, które znalazłem w ciągu kilku dni googlingu, było to najprostsze podejście, jakie mogłem wymyślić - i opinie są zdecydowanie doceniane.
execute
do mojego istniejącego głównego kontroleraAdres URL do wywołania / wykonania zadania:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Zmodyfikowany główny kontroler \ com_example \ controller.php
Nowy subkontroler \ com_example \ kontrolers \ forajax.php
Renderowane wyjście JSON
źródło
Odpowiedź Valentin jest dobra, ale jest nieco zbyt złożona, jeśli wszystko, co musisz zrobić, to dodać 1 lub 2 wywołania ajax do już zbudowanego komponentu. Zupełnie możliwe jest uniknięcie tworzenia osobnych plików
controller.raw.php
lubview.raw.php
plików.Aby wykonać to wywołanie ajax
W
job
subkontrolerzeźródło
Odpowiedź Valentina jest dobra.
Wolę kontroler json, który obsługuje kodowanie i obsługę błędów. Utworzyłem klasę podstawową json:
Ten kontroler zostaje rozszerzony o klasę kontrolera, która działa, mniej więcej tak:
i wywołujesz takie żądanie:
Skrót tokenów jest generowany przez JSession :: getFormToken (). Kompletne pełne połączenie może wyglądać następująco:
Drugi parametr jest ustawiony na „false”, dzięki czemu możemy go używać w wywołaniach javascript bez przepisywania xml.
źródło
JResponseJson
klasy, aby sobie z tym poradzić?Jeśli masz 100% pewności, że żadna wtyczka Thrid-Party nie dodaje żadnych danych wyjściowych JavaScript, czysty kod_json działa.
Ale ... na przykład JomSocial dodaje „” do całej witryny.
Więc ... przydatna sztuczka, zawiń json_encode tagami i przetwarzaj go po stronie Javascript.
źródło
Możesz uzyskać dostęp do kontrolera bezpośrednio, używając nazwy kontrolera w zadaniu:
wywoła: controller.raw.php (return is raw)
wezwie: controller.php (powrót jest html, jeśli nie używać
die;
)źródło