Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как передать массив для JS ?
 
 автор: Terri   (14.05.2007 в 18:50)   письмо автору
 
 

Имеется функция, ниже привожу, кстати её можно посмотреть тут
http://tune.yandex.ru/region/newgeoselector/geoselectorTree.js



//arrayMaker
function arrayMaker(){}
arrayMaker.makeArray = function(iId, iCallerId){

     request="http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID="+iId + "&iCallerId=" + iCallerId +"&rnd="+ Math.random();

            // функция на успех запроса
            var responceOK = function(request, trace) {

                selectFactory.populateList(request.parentRegionID, request.iCallerId);

                if(formManager.tryDisableForm){
                    formManager.tryDisableForm(request.parentRegionID);
                }
            }

            // функция на неудачу запроса
            var responceError = function(trace) {
//                alert(trace);
            }


            // предупреждаем остальных что начали рисовать селект для этого региона, чтобы они не пытались рисовать селект тогоже уровня
            if( selectFactory.confirmLastPosition(iCallerId) ){
                var c = aPopulated.length;
                aPopulated[c] = new Array();
                aPopulated[c]['selfId'] = iId;

            }
            else {
/*                var nxt = selectFactory.detectNextPosition( iCallerId );
                if(nxt==0)return;
                aPopulated[ nxt ] = new Array();;
                aPopulated[ nxt ]['selfId'] = iId;
*/
            }


            try{
               var ajaxObjectGET = new Ajax(
                   new AjaxJS(),
                   request,
                   responceOK,
                   responceError,
                   'resp error'
               );
               ajaxObjectGET.send();
            } catch(e) {
               responceError('init error');
            }
}


при запросе такой ссылки:

request="http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID="+iId + "&iCallerId=" + iCallerId +"&rnd="+ Math.random();

точнее вот эта
http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID=225
эта уже напрямую без параметров JS


получаем массив примерно такого вида:


      
    aRegions225 = new Array();
    var newArray = aRegions225;
    newArray['name'] = new Array();    
    newArray['id'] = new Array();
    newArray['type'] = new Array();
    newArray['haveChilds'] = new Array();
    
      
    
    
    var lng=newArray['name'].length; 
    newArray['name'][lng] = "Дальний Восток";
    newArray['id'][lng]   = "73";
    newArray['type'][lng] = "4";
    
    newArray['haveChilds'][lng] = 1;
                    
  
    
    var lng=newArray['name'].length; 
    newArray['name'][lng] = "Поволжье";
    newArray['id'][lng]   = "40";
    newArray['type'][lng] = "4";
    
    newArray['haveChilds'][lng] = 1;
...




но как сделать чтобы не ссылаться на тот сервер, а брать со своего сервера, допустим с БД, составить базу не проблема, проблема как передать массив каким образом? ведь просто так сгенерировать при помощи PHP и отдать скрипту не получится, я пробывал уже так сделать не получилось. Тоесть я брал уже полученный массив и сохранял в отдельный файл и уже подключал таким образом:

request="http://localhost/166.xml";

и так

request="http://localhost/166.js?parentRegionID="+iId + "&iCallerId=" + iCallerId +"&rnd="+ Math.random();

менял расширения файлов и .xml и .js и так пробывал .txt не получалось почемуто, мне главное понять как происходит передача а там уже я с БД буду передовать

сам в JS не силен, буду признателен за помощь

   
 
 автор: Terri   (15.05.2007 в 10:05)   письмо автору
 
   для: Terri   (14.05.2007 в 18:50)
 

ну так как, есть какие нибудь предложения?

мне нужно только понять как происходить подача массива, я пытался просто подставить с уже имеющим массивом файл, но ничего не получается, он его толи не воспринимает ..

   
 
 автор: coloboc66   (15.05.2007 в 12:26)   письмо автору
 
   для: Terri   (15.05.2007 в 10:05)
 

Вы можете написать в двух словах: откуда и куда вам нужно передать массив? Если из РНР в ява-скрипт, то я бы сделал так: на РНР собрал бы массив в одну строковую переменную, передал бы ее ява-скрипту, а в ява-скрипте опять разобрал бы эту строку в массив.

   
 
 автор: bronenos   (15.05.2007 в 13:52)   письмо автору
 
   для: coloboc66   (15.05.2007 в 12:26)
 

короче говоря так =)
var arJS = "<?=implode('|'$arPHP)?>".split ('|');

при включенных коротких кавычках в .ini

   
 
 автор: Terri   (15.05.2007 в 14:36)   письмо автору
 
   для: bronenos   (15.05.2007 в 13:52)
 

не совсем понял, что вы имели введу?

   
 
 автор: Terri   (15.05.2007 в 14:25)   письмо автору
 
   для: coloboc66   (15.05.2007 в 12:26)
 

мне нужно сделать форму выбора стран,регионов,городов... как тут http://tune.yandex.ru/region/
у них чтобы получить массив для JS, массив передается как я понял через XML уже готовый или может формируется через PHP и потом уже передается по XML

так вот, у них я посмотрел запрос для получения массива такой

request="http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID="+iId + "&iCallerId=" + iCallerId +"&rnd="+ Math.random();

где parentRegionID имеет айди номер выбранного элемента в <option> который передается по "iId"
далее следует параметр iCallerId правдо я непонял что это означает что должно по нему передоватся, и ещё один параметр rnd который получает сгенерированное число, как я понял необязательное

я попробывал заменить её на

request="http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID=225&iCallerId=" + iCallerId;

второе окно загрузилось нормально

решил эту строчку поменять на свою

request="http://localhost/script.php?parentRegionID=225&iCallerId=" + iCallerId;

В скрипте script.php я написал


<?php
      
$r 
" aRegions225 = new Array();
        var newArray = aRegions225;
        newArray['name'] = new Array();        
        newArray['id'] = new Array();
        newArray['type'] = new Array();
        newArray['haveChilds'] = new Array();      
    
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Дальний Восток';
        newArray['id'][lng]   = '73';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                        
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Поволжье';
        newArray['id'][lng]   = '40';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                       
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Северо-Запад';
        newArray['id'][lng]   = '17';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                        
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Сибирь';
        newArray['id'][lng]   = '59';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                        
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Урал';
        newArray['id'][lng]   = '52';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                        
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Центр';
        newArray['id'][lng]   = '3';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;                                       
  
    
        var lng=newArray['name'].length; 
        newArray['name'][lng] = 'Юг';
        newArray['id'][lng]   = '26';
        newArray['type'][lng] = '4';
        
        newArray['haveChilds'][lng] = 1;

                       
      AjaxJS.onload('', {parentRegionID: 225, iCallerId: });

  "
;  

return 
$r;
?>


но почемуто окно не заполнилось со списком, непойму как передать массив для JS

   
 
 автор: CNT   (15.05.2007 в 15:07)   письмо автору
 
   для: Terri   (15.05.2007 в 14:25)
 

AJAX передает только строковую переменную.
А вы собираетесь передать массив, да и не просто массив, а массив со строковыми индексами.
Так не пойдёт.

1. Сформируйте в PHP-скрипте не один массив с четырьмя строковыми индексами, а четыре одномерных массива с числовыми индексами:
arrName
arrId
arrType
arrhaveChilds

2. каждый из сформированных вами массивов преобразуйте в строку, используя разделитель, например, символ #, методом implode или join

3. контеканируйте 4 полученных строки в одну, также используя разделитель #

4. Передавайте именно эту одну строку.

5. На HTML-странице, получив строковую переменную, преобразуйте её в один общий массив методом split, используя тот же разделитель #. Ну а потом методом splice получите из общего массива четыре массива, аналогичных сформированным в PHP-скрипте (длина каждого из них будет равна 1/4 от длины общего массива)

   
 
 автор: Terri   (15.05.2007 в 15:25)   письмо автору
 
   для: CNT   (15.05.2007 в 15:07)
 

У меня все данные будут находится в БД MySQL там у меня структура стандартная (один к одному) обычно разделы так делают: ID | parent_id | name , и вытаскивать я буду по ID номеру

http://localhost/script.php?parentRegionID=225
PHP скрипт должен обратится к БД и выбрать данные по ID номеру и сформировать массив для ява скрипу.

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

   
 
 автор: Terri   (15.05.2007 в 15:03)   письмо автору
 
   для: Terri   (14.05.2007 в 18:50)
 

я тут проверил, зашёл по ссылке без всех параметров
http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml

оказывается что файл getGeoByParent.xml не передаёт как XML формат, а просто передаёт как текстовое, и тот массив тоже что выше приводил передаётся в текстовом варианте, но вот непойму почему у меня не получается его обработать JS скриптом на своём сервере?

   
 
 автор: coloboc66   (15.05.2007 в 15:11)   письмо автору
 
   для: Terri   (15.05.2007 в 15:03)
 

to CNT: я так понял, что ему надо наоборот - передать массив в ява-скрипт...

   
 
 автор: Terri   (15.05.2007 в 15:15)   письмо автору
 
   для: coloboc66   (15.05.2007 в 15:11)
 

всё верно, я так и писал что нужно передавать массив для ява-скрипту :)

   
 
 автор: coloboc66   (15.05.2007 в 15:29)   письмо автору
 
   для: Terri   (15.05.2007 в 15:15)
 

Ну так вам сказали, как это делать. И CNT и bronenos.

   
 
 автор: Terri   (15.05.2007 в 15:33)   письмо автору
 
   для: coloboc66   (15.05.2007 в 15:29)
 

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

http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID=225

то, сервер не выдаёт ввиде одной строки, а там сразу видно что строк много и ява скрипт понимает

   
 
 автор: CNT   (15.05.2007 в 15:32)   письмо автору
 
   для: coloboc66   (15.05.2007 в 15:11)
 

Блин, а я о чём написал-то?

Массив - это виртуальность определённого документа.
То, что является массивом для PHP-сценария, таковым для другого документа (скрипт HTML-страницы) не является.

Передавать JScript'у можно только строку
Поэтому массив ещё в PHP-сценарии должен преобразовываться в текстовую строку, а в JScript'e из строки. если необходимо, надо формировать собственный массив.

PS. 10 человек в военной форме, идущие гурьбой - для вас кто?
Правильно - толпа военных.
А в армии они называются отделением.

   
 
 автор: coloboc66   (15.05.2007 в 15:40)   письмо автору
 
   для: CNT   (15.05.2007 в 15:32)
 

to Terri: я вам рекомендую не смотреть на чужие скрипты и пытаться их изменить под себя (это очень сложно без определенного опыта), а написать свой скрипт с нуля. Сформулируйте для себя МИНИМАЛЬНУЮ задачу, и пошагово начинайте ее решать. Так вы и опыта в программировании наберетесь, и помогать вам будут на форуме намного более эффективно - когда вы будете задавать конкретный вопрос, а не вываливать здоровенный скрипт - кому охота в этом скрипте копаться, если только он не гений???!!!

   
 
 автор: Terri   (15.05.2007 в 15:49)   письмо автору
 
   для: coloboc66   (15.05.2007 в 15:40)
 

но дело в том что я в яве-скрипте ничего не понимаю не изучал его, но знаю PHP, еслибы я знал ява язык, то может быть не задавался подобными вопросами, но ведь и все сразу нельзя знать все языки, а задача к примеру сейчас стоит сделать, вот и пытаюсь решить, а задача в принципе я незнаю, только понять как передать и всё, а всё остальное уже написано, все .js скрипты я слил к себе

Но я ещё попробывал как сделать, удалил все строки переноса все что там выдовалось поместил в одну строку, длинная правдо поучилась, но как неработало так и неработает, странно както

   
 
 автор: coloboc66   (15.05.2007 в 16:06)   письмо автору
 
   для: Terri   (15.05.2007 в 15:49)
 

Вот вам простой алгоритм:

<?php
$arr
=array("Москва","Питер""Горький");
$str_arr=implode("|",$arr);
?>
<script>
var str_arr = "<?=$str_arr;?>".split ('|');
for(i=0;i<str_arr.length;i++)alert(str_arr[i]);
</script>

здесь var str_arr и есть новый массив. Все работает. И ничего странного. Так и передавайте массив в ява-скрипт.

   
 
 автор: CNT   (15.05.2007 в 16:12)   письмо автору
 
   для: Terri   (15.05.2007 в 15:49)
 

В общем, смотрите внимательнее.
На яндексе, как обычно, решили "пойти в обход".
В PHP-сценарии формируется СТРОКА, кою вы здесь продублировали выше (тем где переменная r="")
Т.е. никаких массивов PHP-скрипт вовсе не формирует - он формирует строку, коя на HTML-странице в своём первозданном виде выглядит как "формирование массива"
И вот эту полученную строку JS-код подставляет в виде innerHTML тега <script>

   
 
 автор: Terri   (15.05.2007 в 16:22)   письмо автору
 
   для: CNT   (15.05.2007 в 16:12)
 

хорошо, спасибо, я тогда сейчас буду эксперементировать

to: coloboc66 но у вас передаётся одномерный массив, ну ладно, не буду придерется, попробую ещё поэксперементировать

но вообще то, у них ведь скрипт уже готовый он и должен его обрабатывать те данные что передаются по ссылке
вот сам скрипт
http://tune.yandex.ru/region/newgeoselector/geoselectorTree.js

   
 
 автор: CNT   (15.05.2007 в 16:34)   письмо автору
 
   для: Terri   (15.05.2007 в 16:22)
 

скрипт, который создает новый тег <script> и заполняет его полученной строкой, находится по другому адресу - http://tune.yandex.ru/region/ajax/ajaxjs.js?2

   
 
 автор: Terri   (15.05.2007 в 16:44)   письмо автору
 
   для: CNT   (15.05.2007 в 16:34)
 

ага, спасибо, там всего три файла я тогда находил
ajax.js
ajaxjs.js
geoselectorTree.js

ну я по эксперементирую, что получится

да кстати, а зачем подставляют ?2 на конце расширения .js ?

такое часто бываю замечаю

   
 
 автор: Terri   (15.05.2007 в 19:25)   письмо автору
 
   для: CNT   (15.05.2007 в 16:34)
 

заранее извиняюсь если что не так напишу, ну не понимаю как его исполнить этот скрипт

если тот файл что тут http://tune.yandex.ru/region/ajax/ajaxjs.js?2 исполняет тоесть всё что нужно делает строит в одну строку и как надо передаёт яве-скрипту, то мне уже ненадо на ява-скрипте что-то ещё писать, тогда вопрос такой, как должен оформлен файл который будет содержать данные? я просто даже в текстовый файл скопировал тот массив что получил по ссылке
http://tune.yandex.ru/region/newgeoselector/getGeoByParent.xml?parentRegionID=225
и указал в место той ссылки на свою на тот файл текстовый, но всёже скрипт не заработал..

ладно, если кому-то надоел со своими глупыми вопросами, не пиште, пойму...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования