Перейти к содержимому


Изучаем ajax


  • Вы не можете ответить в тему
Сообщений в теме: 25

#1 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 May 2012 - 12:34 AM

ой беда, беда )))

если есть знатоки прошу помощи.


вот код
<script type="text/javascript" charset="utf-8"> 
$("#countryID").change(function(){
   var id = $(this).val();
   $.ajax({
	  type: 'POST',
	  url: "/index.php?cid",
	  data: {cid : id},
	  error: function(req, text, error) {
		  alert('Ошибка AJAX: ' + text + ' | ' + error);
	  },
	  success: function(e){	 
  $("td.zones").get(0).innerHTML = e; 
	 }
  });
});  
</script>

Я очень старался ))).... суть в чем.
При выборе селектом страны, в файл пхп на обработку отдается её ID....
в пхп разумеется ченить там с ним делается и возвращает массив с областями этой страны.
При этом вывод через шаблон и содержание шаблона подгружается в ячейку с ID zones


Все чудненько работает, НО как мне сделать чтобы кроме массива с областями пхп вернул еще что-то, например массив с городами или пофиг что-нибудь, при этом вывел его также через другой шаблон и подгрузил в ячейку city например.
В обработчике я все сделал - т.е. выводит в шаблон
а как мне теперь на аяксе указать чтобы подгружал в другую ячейку
  • 0

#2 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 May 2012 - 10:41 AM

навскидку стоить посмотреть http://javascript.ru...ie-massiva.html
на функции success поставить разбор строки, и дальше уже работать с данными
  • 1
Изображение Изображение Изображение

#3 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 May 2012 - 11:59 AM

Т.е. записать данные в массив, а потом выводить элементы этого массива, можно попробовать ради эксперимента )) но как мне записать в массив именно вывод шаблона, в пхп у меня идет
$smarty->display( "zones.tpl.html" ); - это выводит области
$smarty->display( "city.tpl.html" ); - это выводит города

ну в результате возвращает оба шаблона в одну ячейку.......... как же их разделить то.
  • 0

#4 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 May 2012 - 12:18 PM

мне кажется примерно так, но я сам еще не делал,
success: function(e){
var user = eval(e); // в e возвращатся должен двумерный масив, или одномерный но в значении каждого поля полный html

$("td.zones").get(0).innerHTML = user.zones;
$("td.city").get(0).innerHTML = user.city;
}

  • 0
Изображение Изображение Изображение

#5 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 May 2012 - 12:24 PM

я так попробовал сразу же но после
var user = eval(e);
скприпт уже не работал.
т.е. даже
alert(user);
или
alert (user.zones);

уже не выводит (((

и даже
alert(e);
перестает работать
  • 0

#6 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 May 2012 - 12:37 PM

ну так, если после eval уже затыкается, то вероятнее всего проблема с экранированием, попробуй отдавать строку примерно такую
({"Zones":"Valik","Cities":"Moldova"})

  • 0
Изображение Изображение Изображение

#7 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 May 2012 - 12:41 PM

Да как же я отдам такую строку?
Задача стоит не в том чтобы просто кусок строки получить, а именно то что в шаблонАХ получить, не могу же я в шаблонах символы экранировать.
я думаю можно конечно запихнуть весь код в пхп и передавать массивом как в твоем примере, там уже можно было бы и экранировать, но это не самый лучший вариант, нужно именно содержание шаблона передать.
  • 0

#8 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 May 2012 - 12:50 PM

чтобы не гадать , все таки нужен php исходник
  • 0
Изображение Изображение Изображение

#9 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 May 2012 - 01:53 PM

Да собственно не особо важно что в исходнике пхп.
В нем кроме вывода в шаблон можно вообще ничего не писать, но может вывод нужно как-то подругому писать.

Ну вот пример
if ($_GET[cid])
{
 $zones = "Область";
 $city= "Город";
 $smarty->assign( "zones",   $zones);
 $smarty->assign( "city",   $city);

$smarty->display( "zones.tpl.html" );
$smarty->display( "city.tpl.html" );
die();
}

А потом собственно сами шаблоны, в которых даже не обязательно использовать переменные из пхп.
zones.tpl.html

<table><tr><td>{zones}</td></tr></table>


city.tpl.html
<table><tr><td>{city}</td></tr></table>

в результате в шаблон index.tpl.html

подтягиваются они оба вместе
и получается
в ячейке zones
<table><tbody><tr><td>Область</td></tr></tbody></table>
<table><tbody><tr><td>Город</td></tr></tbody></table>

а нужно чтобы в zones было
<table><tbody><tr><td>Область</td></tr></tbody></table>

а в city было

<table><tbody><tr><td>Город</td></tr></tbody></table>

  • 0

#10 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 19 May 2012 - 03:34 PM

все равно что первое приходит на ум, так это выдавать масивом, но использовать не display, http://www.smarty.ne...u/api.fetch.tpl
прямо в переменную, из этих переменных формировать правильный массив (переведя их пердварительно в base64)
  • 1
Изображение Изображение Изображение

#11 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 12:17 AM

Спасибо, велликолепно, то что нада, передаю в base64 - все передается отлично, только после раскодировки нет кириллицы ((( теперь вот бьюсь вот на этим
  • 0

#12 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 20 May 2012 - 12:36 AM

ну тут два варианта, читать статью http://javascript.ru/php/base64_decode и допиливать javascript функции

и другой вариант для извращений (но он мне нравится) :)
document.HiddenFieldsForm.option_select_hidden_{$select_counter_var2}.value = {php}ob_start();{/php}variantID{php}$out1 = ob_get_contents();ob_end_flush();{/php};
допустим где то перед записыванием в ячейку присвоить просто какой то пременной это значение и получить php буфер, а потом уже присваивать используя php функцию base64_decode
  • 0
Изображение Изображение Изображение

#13 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 12:50 AM

ну тут два варианта, читать статью http://javascript.ru/php/base64_decode и допиливать javascript функции

ну я так и сделал
декодировал из base64, но проблема с кодировкой, и не только у меня вот смотрю у многих но решения не нашел еще.

А в пхп насколько я понял такой проблемы нет......... ну буду пробовать дальше.
  • 0

#14 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 12:35 PM

допустим где то перед записыванием в ячейку присвоить просто какой то пременной это значение и получить php буфер, а потом уже присваивать используя php функцию base64_decode

С этим проблема, по крайней мере у меня, передать значение переменной из жаваскрипт в пхп невозможно, а если опять отправлять в обработчик, чтобы раскодировать, то смысл? ведь я как раз только закодировал его для передачи.
В предложенном примере как я понимаю наоборот переменные пхп используются в коде жаваскрипт, но у нас то нет в пхп переменных.

Искал методы перекодировки на JS как ни странно ни одна из опробованных функций не помогла. Попытался в браузере переключить кодировку, выяснилось что ни одна не походит, складывается впечатление что я вообще пытаюсь решить не ту задачу.

Вопрос остается открытым ((

Прикрепленный файл  strana.jpg   5.31К   2 Количество загрузок:

вот что я получаю, может тут вопрос и не в кодировке?
  • 0

#15 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 May 2012 - 12:45 PM

от что я получаю, может тут вопрос и не в кодировке?

ИМХО, вопрос в не русифицированном шрифте.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 01:00 PM

ИМХО, вопрос в не русифицированном шрифте.

да нет шрифты стандартные, шрифт тут не при делах...... :(

Все проблема решена.

вместо base64
использовал функцию escape(); для кодирования
т.к. в пхп ее по сути нет, то добавил аналог:

    function js_urlencode($str)
    {
	 $str = mb_convert_encoding($str, 'UTF-16', 'Windows-1251');
	 $out = '';
	 for ($i = 0; $i < mb_strlen($str, 'UTF-16'); $i++)
	 {
	  $out .= '%u'.bin2hex(mb_substr($str, $i, 1, 'UTF-16'));
	 }
	 return $out;
    }


ну а в js разумеется unescape();

Теперь все чудненько работает.)))) Спасибо.
  • 0

#17 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 20 May 2012 - 01:01 PM

передать значение переменной из жаваскрипт в пхп невозможно

это как невозможно то а?
а я что написал в ссылке, там готовый пример, стоит просто посмотреть :)
даже выделю имеено эту часть кода

{php}ob_start();{/php}variantID{php}$out1 = ob_get_contents();ob_end_flush();{/php};

  • 1
Изображение Изображение Изображение

#18 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 01:28 PM

Да я смотрел только я не сталкивался еще с функциями ob_get_contents(); и поэтому решил что это какие-то функции движка. Ну и в результате увидел что!?!? Как в строке по онклик присваивается значение для value результата выполнения функций пхп. - т.е. получения переменной от js нет. Но не очевидно что можно получить значение из буфера...........

И все равно мне пока не понятен этот метод и кажется мое решение проще.))
т.к. во первых для декодирования из base64 все равно нужно добавлять функцию только на стороне js.
во вторых потом приходится выполнять кучу гемороя с буферизацией, которой я при этом еще и не понимаю пока что......

а если кодировать через escape(); то достаточно добавить функцию в пхп. ))

Однако опыт работы с предложенным тобой вариантом думаю будет очень полезен, поэкспериментирую еще над этим.
  • 1

#19 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 20 May 2012 - 01:46 PM

в данном случае твое решение однозначно проще ))
передать напрямую переменную нельзя, но можно ее поймать на выводе на экран,
как пример из варинатов

success: function(e){
var user = eval(e); // в e возвращатся должен двумерный масив, или одномерный но в значении каждого поля полный html

var x = {php}ob_start();{/php}user.city{php}$out1 = ob_get_contents();ob_end_flush();{/php}

$("td.zones").get(0).innerHTML = user.zones;
$("td.city").get(0).innerHTML = {php}echo base64_decode($out1){/php};
}

подумав еще кажется, что данный метод для ajax не прокатит, так как выполняется один раз на стороне smarty
  • 0
Изображение Изображение Изображение

#20 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 20 May 2012 - 04:26 PM

Такс у меня очередная проблема ).

Суть:
При загрузке страницы выводится список стран в селекте (по умолчанию выбрана Украина), и список областей (по умолчанию выбрана первая область Винницкая)
1. Выбираем Страну - Россия, отправляется id в обработчик, возвращается список областей России в селекте, с заменой в шаблоне (см. выше).
С этим все ок.

2. При загрузке страницы выводится список стран в селекте (по умолчанию выбрана Украина), и список областей (по умолчанию выбрана первая область Винницкая)
Не трогаем страны, а выбираем другую Область, при этом Алертом выводится список городов этой области или надпись что в этой обрасти нет городов ну или пофиг что срабатывает действие алерт.
Все работает

3. При загрузке страницы выводится список стран в селекте (по умолчанию выбрана Украина), и список областей (по умолчанию выбрана первая область Винницкая)
Выбираем страну - Россия, выводится список областей России, выбираем область России и все......... алерт уже не срабатывает. Почему? Выбираем снова Украина, область - и нифига Алерт уже не работает. Смотрю код - все на месте скрипт в коде, id, name, class - все точно такое же.

В чем может быть проблема? (

Т.е. если выполняется функция выбора страны и вывода областей, то функция выбора области и вывода городов уже не работает.
  • 0