Создаем простой AJAX компонент

06/01/2010 Создание компонента Joomla 1.5

В этом примере я продемонстрирую как легко и быстро можно сделать AJAX компнент.

Итак возмем самый простой компонент, можно от сюда.

Открываем файл контроллера (components\com_hello\controller.php) и добавляем в него новую функцию (или task)

	function hello()
{
sleep(2); // добавим немного задумчивости, для реализма :)
$id = JRequest::getVar('id');
$model = $this->getModel('myuser');
$myuser = $model->getUser($id);
if ($myuser) {
$html = 'Ваше имя: ' . $myuser->name;
$html .='
Ваш логин: '
. $myuser->username;

$html .='
Ваш email: '
. $myuser->email;

} else {
$html = 'Пользователя с таким ID не существует';
}
echo $html;
}
Не забываем про кодировку. Файл нужно сохранить в кодировке UTF8 без BOM.

Здесь как видно идет обращение к модели, которой пока еще нет. Сейчас как раз и создадим ее. Итак создаем файл com_hello\models\myuser.php следующего содержания:

Как видно из кода метод getUser возвращаят объект, который содержит значение всех полей указанного пользователя. Ну вобщем это все стандартные операции Joomla, здесь останавливаться не стоит.

Дальше создадим новый файл скрипта components\com_hello\js\hello.js, следующего содержания:

function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
 
// javascript-код голосования из примера
function ajaxfunction() {
// (1) создать объект для запроса к серверу
var req = getXmlHttp()
 
// (2)
// span рядом с кнопкой
// в нем будем отображать ход выполнения
var statusElem = document.getElementById('status');
var id = document.getElementById('userid').value;
 
req.onreadystatechange = function() {
// onreadystatechange активируется при получении ответа сервера
 
if (req.readyState == 4) {
// если запрос закончил выполняться
 
statusElem.innerHTML = req.statusText // показать статус (Not Found, ОК..)
 
if(req.status == 200) {
// если статус 200 (ОК) - выдать ответ пользователю
var newElement = document.createElement('div')
newElement.innerHTML = req.responseText
statusElem.appendChild(newElement)
}
// тут можно добавить else с обработкой ошибок запроса
}
 
}
 
// (3) задать адрес подключения
req.open('GET', 'index.php?option=com_hello&task=hello&format=raw&id='+id, true);
 
// объект запроса подготовлен: указан адрес и создана функция onreadystatechange
// для обработки ответа сервера
 
// (4)
req.send(null); // отослать запрос
 
// (5)
statusElem.innerHTML = 'Ожидаю ответа сервера...'
}

Здесь стоит обратить внимание на ссылку, в ней присутствует параметр format=raw. Это означает, что она вернет нам не весь документ, а только ту часть которую возвращает компонент. Про все остальное рассказывать не буду, лучше почитать соответствующую литерату.

Теперь нам нужно подключит этот скриптт. Добавим в вид com_hello\views\hello\view.html.php

$document    = &JFactory::getDocument();
$baseurl = JURI::base();
$document->addScript($baseurl . "components/com_hello/js/hello.js");

Так же можно использовать вместо путей константы Joomla, я выбрал такой вариант.

Ну и последнее, добавлеяем в шаблон нужные элементы com_hello\views\hello\tmpl\default.php добавляем

Введите ID пользователя
<input type="text" id="userid" maxlength="3" size="2" />
<br />
<a href="#" onclick="ajaxfunction()">Пуск</a>
<div id="status"></div>

Как видно из шаблона кликая на ссылку вызывается функция ajaxfunction(), которая была описана в файле hello.js

Ну вот и все результатом работы данного компонента будет вывод информоции о пользоателе по его ID, с помощью AJAX.

Вложения:
com_demo_ajax.zip[ ] (1543) Загрузок

23 

Комментарии   

 
0 Kirill
16.04.2010 11:19
Спасибо! Полезная информация!
 
 
-2 ecolora
24.06.2010 12:57
Попробовал установить Ваш демо-компонент. В админ-панели, при выборе его в меню в списке компонентов, Joomla ругается, мол:
404 - Возникла ошибка
Component Not Found
 
 
-2 Nick
08.07.2010 17:00
Большая просьба автору: не могли бы вы для примера создать точно такой же компонент (поиск пользователя), но без AJAX, чисто на PHP, и также вывесить на этом сайте. Заранее, спасибо.
 
 
+1 Виталий
12.09.2010 23:13
Я только начинаю, разбираться в Joomka и Ajax, сделал по примеру а при ответе с сервера вылетает сообщение Internal Server Error, я так понимаю, что ошибка где то в JS, алертами проверил readystatу 4, а вот статус вместо 200 500, куда рыть? подскажите
 
 
-1 m667v
05.10.2010 16:17
хороший пример, но можно было побольше комментариев вставить
 
 
-1 Глас народа
02.03.2011 15:35
Виталий, проверьте присутствует ли у вас контролер из которого вы вызываете метод (task) в этой строке.

req.open('GET', 'index2.php?option=com_seanceorder&controller=order&task=ajax_order&id='+id, true);


Господа не ленитесь помогайте людям и людям помогут вам, если бы кто-то написал это раньше мне бы не пришлось тратить несколько часов на поиск решения, но я сохраню эти часы другим людям.
 
 
-1 Глас народа
02.03.2011 15:35
название контролера у вас своё будет.
 
 
-1 JFan
01.04.2011 15:35
Автору респект. Оч помогли! Спасибо:)
 
 
-2 PigmaLion
09.06.2011 00:52
Автору мега-респект! Помог сделать халтуру и не только) С удовольствием бы поработал в команде с таким профи.
 
 
+1 Nikko320
05.08.2011 18:01
1 В примере файл hello.js
строка req.open('GET', 'index.php?option=com_demoajax&task=hello&format=row&id='+id, true);
формат данных RAW, а не ROW!!!
2 В тексте отсутствует содержимое модели myuser.php

За информацию спасибо!
 
 
+1 bondarenkosss
04.10.2011 12:47
Народ, у кого получилось прикруть это к joomlЕ? Исходники, которые предлагает скачать автор в чистом виде неработоспособны. Если делать как в статье - отсутствует листинг myuser.php... Взял myuser.php из исходников, но всё равно ничего не выходит, ввожу id - пишет Internal Server Error.
Автор, ну оформите по человечески статью. Я новичок и на выявление ошибок уходит очень много времени.
Хотябы исходники то должны работать! Хрен с ним с листингом!
 
 
+3 SmokerMan
11.10.2011 00:00
Цитирую bondarenkosss:

Автор, ну оформите по человечески статью. Я новичок и на выявление ошибок уходит очень много времени.
Хотябы исходники то должны работать! Хрен с ним с листингом!

С помощью выявления ошибок некоторые люди как раз и учатся. Если ничего не делать и не пробовать, то толку от этого не будет.
На момент написания статьи все проверялось и работало, иначе бы не выкладывалось.
 
 
+1 bondarenkosss
11.10.2011 20:24
Да всё верно, беру свои слова обратно. Всё работает отлично. С толку сбивает то, что в админке компонента показывает ошибку.
Сделал на основе Вашего компонента свой. Спасибо!
 
 
-1 webinf
29.11.2011 12:03
Спасибо за статью - помогло.
В файле hello.js вместо - Ожидаю ответа сервера... - вставил . Картинку загрузчика можно сформировать здесь ajaxload.info
Мешало ОК после отработки скрипта. Вставил statusElem.innerHTML = null в условие if(req.status == 200) {
Может есть другой вариант?
 
 
-1 webinf
29.11.2011 12:05
Тег img выбросило
- вставил img src="/images/stories/ajax-loader.gif"
 
 
-1 Вотчо
13.04.2012 01:49
Вот чо?
 
 
0 Гдебл9
10.10.2013 15:14
Итак создаем файл com_hello\models\myuser.php следующего содержания:
Где содержание то >
 
 
+1 Витимс
02.07.2014 13:31
можете помочь с обновлением комментариев без перезагрузки страницы в k2?