В принципе, в своей сборке Open SLAED SE я давно уже поменял структуру системы ajax, но на днях столкнулся еще с одной проблемой - класс SACK, который используется в Slaed полный отстой:
1 для каждого запроса GET или POST необходимо создавать отдельные функции и перечислить в них все переменные;
2 класс не воспринимает свойство формы "multipart/form-data"!
в общем с помощью имеющегося SACK я так и не смог организовать загрузку файлов на сервер.
Для своих целей я нашел кроссбраузерный класс ajax с поддержкой закачки файлов JsHttpRequest. Теперь при помощи этого класса я окончательно переделал всю систему систему ajax в своей сборке Slaed CMS.
Здесь я опишу лишь принцип изменений системы, чтобы каждый заинтересованный веб-мастер смог это сделать не зависимо от версии используемой CMS. Постараюсь сделать это подробно...
Этап первый. Подключаем новый скрипт.
Скачиваем архив JsHttpRequest и распаковываем во временный каталог. Копируем каталог /lib в каталог /ajax своего сайта. Открываем основной файл функций, для Open SLAED это function/function.php и находим фукнцию head(). В этой функции ищем строку:
и перед ней вставляем еще одну
Сохраняем файлы. Новые жабаскрипты теперь будут подгружаться на всех страницах сайта.
Второй этап. Подключаем новые функции PHP и меняем структуру системы ajax.
Открываем файл /ajax.php в корневом каталоге сайта, ищем...
Нет! Настолько все запущено, не могу удержаться от сарказма, извините... Придется переписать весь файл!
В комментариях приведенного ниже содержимого /ajax.php определенно и четко видно новую структуру для системы ajax:
Думаю вы поняли, что эти изменения позволят подгружать свои функции для ajax в самописных модулях.
Теперь необходимо открыть файл /ajax/global_func.js и добавить в него две новые функции:
Наконец переходим к самому скучному последнему этапу...
Этап три. Обновление функций и отладка системы.
Теперь необходимо запастись терпением и обновить все старые вызовы ajax. Искать старые вызовы вам придется самостоятельно, ибо как я уже сказал, это не подробная инструкция по сбору конструктора. Для поиска по всем файлам в каталогах рекомендую воспользоваться Macromedia Dreamweaver.
Пример для передачи данных методом POST. Простейший модуль, файл modules/test_modul/index.php:
файл modules/test_modul/ajax.php:
Как видите, теперь система передает содержимое всех полей формы, сколько бы их ни было, включая тип "file". Для передачи данных через форму методом GET так же можно использовать функцию doPost() лишь указав method="GET".
Функция doGet нужна в тех местах, где нельзя использовать формы ввода. Все просто:
Обратите внимание, что вместо символа "&" в запросе используется ":"! Это фиксит валидность кода.
На этом вроде все... Надеюсь, информация станет полезной.
PS
http://pdator.ru/contact-rights.html Всем удачи!
1 для каждого запроса GET или POST необходимо создавать отдельные функции и перечислить в них все переменные;
2 класс не воспринимает свойство формы "multipart/form-data"!
в общем с помощью имеющегося SACK я так и не смог организовать загрузку файлов на сервер.
Для своих целей я нашел кроссбраузерный класс ajax с поддержкой закачки файлов JsHttpRequest. Теперь при помощи этого класса я окончательно переделал всю систему систему ajax в своей сборке Slaed CMS.
Здесь я опишу лишь принцип изменений системы, чтобы каждый заинтересованный веб-мастер смог это сделать не зависимо от версии используемой CMS. Постараюсь сделать это подробно...
Этап первый. Подключаем новый скрипт.
Скачиваем архив JsHttpRequest и распаковываем во временный каталог. Копируем каталог /lib в каталог /ajax своего сайта. Открываем основной файл функций, для Open SLAED это function/function.php и находим фукнцию head(). В этой функции ищем строку:
$strhead .= "<script language=\"JavaScript\" type=\"text/javascript\" src=\"ajax/global_func.js\"></script>\n";
$strhead .= "<script type=\"text/javascript\" src=\"ajax/lib/JsHttpRequest/JsHttpRequest.js\"></script>\n"; $strhead .= "<script language=\"JavaScript\" type=\"text/javascript\" src=\"ajax/global_func.js\"></script>\n";
Сохраняем файлы. Новые жабаскрипты теперь будут подгружаться на всех страницах сайта.
Второй этап. Подключаем новые функции PHP и меняем структуру системы ajax.
Открываем файл /ajax.php в корневом каталоге сайта, ищем...
Нет! Настолько все запущено, не могу удержаться от сарказма, извините... Придется переписать весь файл!
В комментариях приведенного ниже содержимого /ajax.php определенно и четко видно новую структуру для системы ajax:
<?php define("MODULE_FILE", 1); /* Подгружаем основной файл функций. */ include('function/function.php'); /* Подключаем языковые файлы и функции шаблонов оформления. */ get_lang(); $ThemeSel = get_theme(); if(file_exists('templates/'.$ThemeSel.'/index.php')) include('templates/'.$ThemeSel.'/index.php'); else include('function/template.php'); include('function/no-cache.php'); /* Подгружаем класс новой системы ajax для обработки передаваемых переменных. Не забудьте указать свою кодировку! */ include('ajax/lib/JsHttpRequest/JsHttpRequest.php'); $JsHttpRequest =& new JsHttpRequest("UTF-8"); /* Из обязательных переменных нам понадобятся лишь две! */ $op = text_filter($_REQUEST['op']); $mod = text_filter($_REQUEST['mod']); if(file_exists('modules/'.$mod.'/ajax.php')){ /* Подгружаем файл ajax.php из каталога модуля, если таковой существует. Все далнейшее управление происходит через модуль. */ include('modules/'.$mod.'/ajax.php'); exit(); }else{ /* В противном случае обрабатываем переменную $op и вызываем одну из стандартных функций системы. */ switch($op){ /* Эти функции только для Open SLAED SE :) */ case 'captcha': $name = gen_pass(4); echo '<img src="/?captcha='.$name.'" alt="'._SECURITYCODE.'" onmouseover="Tip(\''._SECURITYCODE.'\');" />'; break; case 'lpoints': if(is_user()){ $userinfo = getusrinfo(); $postid = intval($userinfo['user_id']); update_points(9, $postid); } break; /* ----------------------------------- */ case 'show_files': show_files(); break; case 'user_sainfo': user_sainfo(); break; case 'user_sinfo': $id = intval($_GET['id']); user_sinfo($id); break; case 'get_user': get_user(); break; default: rating(); break; } } ?>
Думаю вы поняли, что эти изменения позволят подгружать свои функции для ajax в самописных модулях.
Теперь необходимо открыть файл /ajax/global_func.js и добавить в него две новые функции:
// Ajax functions POST & GET
function doPost(frm, blk){
var req = new JsHttpRequest();
obj_frm = document.getElementById(frm);
obj_blk = document.getElementById(blk);
req.loader = 'FORM';
req.onreadystatechange = function(){
if(req.readyState == 4){
obj_blk.innerHTML = req.responseText;
}
}
req.open(null, 'ajax.php', true);
req.send( { q: obj_frm } );
}
function doGet(url, blk){
url = url.replace(/:/g,'&')
var req = new JsHttpRequest();
obj_blk = document.getElementById(blk);
req.onreadystatechange = function(){
if(req.readyState == 4){
obj_blk.innerHTML = req.responseText;
}
}
req.open('GET', url, true);
req.send(null);
}
function doPost(frm, blk){
var req = new JsHttpRequest();
obj_frm = document.getElementById(frm);
obj_blk = document.getElementById(blk);
req.loader = 'FORM';
req.onreadystatechange = function(){
if(req.readyState == 4){
obj_blk.innerHTML = req.responseText;
}
}
req.open(null, 'ajax.php', true);
req.send( { q: obj_frm } );
}
function doGet(url, blk){
url = url.replace(/:/g,'&')
var req = new JsHttpRequest();
obj_blk = document.getElementById(blk);
req.onreadystatechange = function(){
if(req.readyState == 4){
obj_blk.innerHTML = req.responseText;
}
}
req.open('GET', url, true);
req.send(null);
}
Наконец переходим к самому скучному последнему этапу...
Этап три. Обновление функций и отладка системы.
Теперь необходимо запастись терпением и обновить все старые вызовы ajax. Искать старые вызовы вам придется самостоятельно, ибо как я уже сказал, это не подробная инструкция по сбору конструктора. Для поиска по всем файлам в каталогах рекомендую воспользоваться Macromedia Dreamweaver.
Пример для передачи данных методом POST. Простейший модуль, файл modules/test_modul/index.php:
<?php if(!defined("MODULE_FILE")){ header('Location: .././index.php'); exit; } function main(){ global $conf; head(); open(); echo '<div id="adiv"></div><form id="aform" method="post"><div>' .'Your title: <input type="text" name="title_text" /><br />' .'Your e-mail: <input type="text" name="email_text" />' .'<input type="hidden" name="mod" value="'.$conf['name'].'" />' .'<input type="hidden" name="op" value="show_data" />' .'<input type="button" onclick="doPost(\'aform\', \'adiv\');" />' .'</div></form>'; close(); foot(); } switch($op){ default: main(); break; }
файл modules/test_modul/ajax.php:
<?php if(!defined("MODULE_FILE")){ header('Location: .././index.php'); exit; } function show_data(){ $title = text_filter($_POST['title_text']; $email = text_filter($_POST['email_text']; echo 'Title = '.$title.'<br />E-Mail = '.$email; } switch($op){ case 'show_data': show_data(); break; } ?>
Как видите, теперь система передает содержимое всех полей формы, сколько бы их ни было, включая тип "file". Для передачи данных через форму методом GET так же можно использовать функцию doPost() лишь указав method="GET".
Функция doGet нужна в тех местах, где нельзя использовать формы ввода. Все просто:
<img src="images/all/refresh.gif" style="cursor: pointer;" onclick="doGet('ajax.php?op=user_sinfo:id=2', 'sinfo2');" alt="Обновить" />
Обратите внимание, что вместо символа "&" в запросе используется ":"! Это фиксит валидность кода.
На этом вроде все... Надеюсь, информация станет полезной.
PS
http://pdator.ru/contact-rights.html Всем удачи!