Прямая ссылка AJAX при использовании XML + XSLT

49 views
Skip to first unread message
Message has been deleted

andysoft

unread,
Oct 29, 2008, 3:48:39 AM10/29/08
to Fullajax
Привет Руслан привет Всем :-)
Есть такая тема.
Есть аддон на фуллаякс который добавляет атрибут xslt для парсинга и
потом XML которая пришла с сервака, на клиенте трансформирует в XHTML.
Потом можно ходить вот по таким ссылкам
<a ax_id="middle" href="pages/get_section.php?group_id=11"
ax_xslt="xslt/pages/get_section.xslt">Развлечения</a>
pages/get_section.php?group_id=11 отсюда приходит XML
Но засада в том что когда делаешь прямые ссылки SRAX.directLink(),
XML то он тянет а толку :-) в middle будет пусто.
Надо подпатчить SRAX.linkEqual чтобы можно было добавлять аттрибут
xslt чтоб он эту XML еще и трансформил.
Ясно изложил? :-)

PS. Может есть какие нибудь другие варианты обхода?. У кого нибудь
есть соображения по этому?

Ruslan

unread,
Oct 29, 2008, 4:31:33 AM10/29/08
to Fullajax
приведи код, каким образом ты работаеш с атрибутом ax_xslt.

Кстати у нас появился форум http://forum.fullajax.ru

andysoft

unread,
Oct 29, 2008, 4:38:12 AM10/29/08
to Fullajax
SRAX.attrs.push('xslt');//добавляем атрибут xslt для парсинга
ax:xslt в елементах <a>

//регистрируемся на событие 'response' для всех потоков запросов
HTML
SRAX.Html.onall('response', function(ops){
//ops.options - это опции обьекта-потока запроса
var xslt = ops.options.xslt;
if (xslt) {
ops.options.nohistory = 0; //определяем что не хотим историю
//переопределяем ответ ops.text
//в новых версиях введено сокращение reponseText = text и
reponseXML = xml
ops.text = XSLTTransform(ops.text, xslt);
}
})

//функция для преобразования
function XSLTTransform(text, xsltFile){



if(typeof(ActiveXObject) == 'undefined') var xml = new
DOMParser().parseFromString(text, "application/xml");
else { var xml = new ActiveXObject('MSXML.DomDocument');xml.async
= false;xml.loadXML(text);}
var xslt;
if (window.ActiveXObject) xslt = new
ActiveXObject("Microsoft.XMLDOM");
else xslt = document.implementation.createDocument('', 'myxml',
null);
xslt.async = false;
xslt.load(xsltFile);
if (window.ActiveXObject) return xml.transformNode(xslt);
else{
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
var doc = xsltProcessor.transformToDocument(xml);
var xmls = new XMLSerializer();
return xmls.serializeToString(doc);
}
}

Знаю что открылся :-) я туда тоже написал тока туда че то никто не
ходит.

Ruslan

unread,
Oct 29, 2008, 7:15:17 AM10/29/08
to Fullajax
туда я хожу по мере освобождённости, а почта сыпется даже когда
занят :), отвечу в форуме

Ruslan

unread,
Oct 29, 2008, 7:18:53 AM10/29/08
to Fullajax
значит у тебя SRAX.direckLink вызывается раньше чем
SRAX.Html.onall ... приведи код с этими функциями

и если не тяжело, продублируй пожалуйста в форуме эту тему полностью

On 29 окт, 10:38, andysoft <andys...@mail.ru> wrote:

andysoft

unread,
Oct 29, 2008, 8:15:42 AM10/29/08
to Fullajax
SRAX.directLink() я просто ставлю внизу главной страницы
Прямые ссылки работают когда ответ html а когда xml нет.

В том то и дело когда я иду по ссылке аттрибут xslt присутствует и
функция XSLTTransform(ops.text, xslt) срабатывает
В аддоне код которого выше есть условие
if (xslt) {
ops.options.nohistory = 0; //определяем что не хотим историю
//переопределяем ответ ops.text
//в новых версиях введено сокращение reponseText = text и
reponseXML = xml
ops.text = XSLTTransform(ops.text, xslt);
}

А когда я рефрешу страницу например которая была сгенерирована из xml
с преобразованием xslt
там линк вот например вот такой

https://domain.ru/a/#:ax:middle:/a/pages/get_templates.php[~q~]group_id=6

твой парсер видит что есть ax:middle див который надо проапдейтить
есть путь где взять html :/a/pages/get_templates.php[~q~]group_id=6
а аттрибута xslt нет и он не знает что еще надо преобразование сделать
и естественно преобразование не происходит
var xslt = ops.options.xslt;
ops.options.xslt вот этого аттрибута нету и его значения тоже
поэтому откуда он преобразование будет брать

т.е скрипт вот сюда не проваливается

if (xslt) {
ops.options.nohistory = 0; //определяем что не хотим историю
//переопределяем ответ ops.text
//в новых версиях введено сокращение reponseText = text и
reponseXML = xml
ops.text = XSLTTransform(ops.text, xslt);
}

поэтому приходит просто xml и естественно html пустой так как
преобразования нету.

я думаю надо когда генерится прямая ссылка добавлять параметр типа так
https://domain.ru/a/#:ax:middle:/a/pages/get_templates.php[~q~]group_id=6:xslt:/a/pages/get_templates.xslt
и твой парсер будет брать место где лежит преобразование



Message has been deleted

andysoft

unread,
Oct 30, 2008, 9:29:35 AM10/30/08
to Fullajax
Уфф я это сделал :-)
Надо добавить параметр xslt в две строки
2599 SRAX.History.add(idLayer, loc, '', o.xslt); //добавляем xslt в
вызов функции

2897 var res = SRAX.History.fireEvent('beforeadd', {
hash:hash,
rhash:rhash,
id:id,
url:loc,
loc:loc, //deprecated
prefix:prefix,
xslt:xslt}) //и передаем xslt в событие beforeadd


И еще чуть патчим функцию go2Hax

Добавляем такую строчку
2729 xslt = href.split(curAx[id].replace('?','[~q~]') + ':xslt:');

и добавляем в hax параметр xslt
2741 hax(url, {id:id, nohistory:startPage, startPage:startPage,
rc:options.rc, xslt:xslt[1]});


Аддон для фулаякса теперь выглядит так

SRAX.attrs.push('xslt');//добавляем атрибут xslt для парсинга
ax:xslt в елементах <a>

SRAX.History.on('beforeadd', function(ops){
if(ops.hash.indexOf(':xslt:')!=-1) ops.hash =
ops.hash.substring(0,ops.hash.indexOf(':xslt:')); //затираем параметр
xslt
if(ops.xslt) return ops.hash + ':xslt:' + ops.xslt; //если надо
преобразование добавляем значение xslt в адресную строку
else return ops.hash; //если просто html не добавляем
});
//регистрируемся на событие 'response' для всех потоков запросов
HTML
SRAX.Html.onall('response', function(ops){
if (ops.options.xslt) {ops.text = XSLTTransform(ops.text,
ops.options.xslt);} //вызываем функцию преобразования
})

//функция для преобразования
function XSLTTransform(text, xsltFile){
if(typeof(ActiveXObject) == 'undefined') var xml = new
DOMParser().parseFromString(text, "application/xml");
else { var xml = new ActiveXObject('MSXML.DomDocument');xml.async
= false;xml.loadXML(text);}
var xslt;
if (window.ActiveXObject) xslt = new
ActiveXObject("Microsoft.XMLDOM");
else xslt = document.implementation.createDocument('', 'myxml',
null);
xslt.async = false;
xslt.load(xsltFile);
if (window.ActiveXObject) return xml.transformNode(xslt);
else{
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslt);
var doc = xsltProcessor.transformToDocument(xml);
var xmls = new XMLSerializer();
return xmls.serializeToString(doc);
}
}

Вуаля все работает :-) теперь можно получать ответ и в html и в
результате трансформации xslt
и работают прямые ссылки на страницы которые должны быть преобразованы
например
https://mydomain.ru/new/index.php#:ax:middle:/new/php/card_accounts.php[~q~]group_id=6:xslt:xslt/card_accounts.xslt
Reply all
Reply to author
Forward
0 new messages