Все кто пытался писать модули для MODx знают что передача параметров через хитро сформированные ссылки, то есть, методом GET затруднена. В этом посте я расскажу как именно и расскажу как я решил эту проблему для себя.
Сразу оговорюсь — проблема касается админки. Потому что она построена на фреймах (я говорю о MODX Evolution). Вы не видите адрес фрейма, поэтому не знаете что адрес любого модуля выглядит примерно так:
/manager/index.php?a=112&id=1
Где id — это id модуля.
Предположим, мы сделали в своем модуле ссылку вида:
<a href=".?action=purpurpur&tits=gtfo">Клик</a>
Если на нее нажать она вызовет скрипт index.php с потерянными параметрами a и id:
/manager/index.php?action=purpurpur&tits=gtfo
И, следовательно, параметры модулю переданы не будут, а пользователь получит перезагрузку админки модэкса. Такая вот проблема.
Ну первое что приходит в голову — просто дописывать каждой ссылке параметры id и a. Но это надо не забывать об этом и забыть о портабельности. Ведь если у вас это модуль номер 2, то на соседнем сайте — номер 6. Для портабельности нужно парсить номер модуля и подставлять его как переменную шаблона и оооо, столько геморроя! Я отказался от этого метода.
Я подумал что слишком много возни с тасканием параметров GET с собой. И вспомнил о том, что параметры GET сохраняются при передаче данных методом POST!
В большинстве случаев нам не важно как именно были переданы данные. Тем более что нет ничего такого в GET, чего бы не мог POST. Так что я решил передавать все данные методом POST.
Но как? Это ведь надо все делать формами и ссылками! Еще больший геморрой? А вот и нет. Я нашел способ делать обычные ссылки, которые отправляют данные методом POST. Военная хитрость!
Конечно, сама по себе ссылка не может отправлять данные постом. Но событие нажатия на ссылку можно легко отследить яваскриптом! Яваскриптом же можно определить куда должен быть соверешен переход и какие параметры должны передаться. Яваскриптом же можно сконструировать форму для передачи тех же самых данных методом пост. И одной командой ее отправить!
Итак, ловим значение, делаем форму, наполняем полями с такими же парами имя-значение, отправляем форму.
Это я делал при помощи jQuery и вот что у меня получилось.
$(function() {
$('.link').live('click',function() { //для всех ссылок.Даже для генерируемых скриптом или появившихся позже
var href = $(this).attr('href'); //куда хотим идти?
href = href.replace(/^[.\/?]+/,''); //удаляем ненужные символы в начале
var arr = href.split(/&/); //разбиваем на пары ключ=значение
var data=new Object(); //здесь будут данные
//формируем объект данных
$(arr).each(function() {
var d = this.toString().split('=');
data[d[0]] = d[1];
});
//id форме нужен чтобы можно было ее отправить
var form_id = 'get-post-form';
var form = '<form method="post" id="'+form_id+'">';
//создаем скрытые поля формы
for(name in data) {
var v = data[name];
form += '<input type="hidden" name="'+name+'" value="'+v+'"/>';
}
form += '</form>';
//вставляем форму в конец страницы
$('body').append(form);
//отправляем
$('#'+form_id).submit();
//предотвращаем переход по ссылке
return false;
});
});
Это решение подразумевает что в href ссылок вы не будете использовать абсолютные пути, а будете использовать только пути таких видов:
?action=show_tits
.?action=show_tits
./?action=show_tits
Это решение я опробовал у себя и уже использую в одном своем модуле. Буду использовать и в последующих, ибо удобно. Велкам!