Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2008, 14:05   #1
Timpi
Пользователь
 
Аватар для Timpi
 
Регистрация: 20.10.2007
Сообщений: 29
Вопрос Взаимодействие между переменными в JavaScript и РНР

Доброе время суток!

Недавно вновь взялся за изучение JavaScript, так что я можно сказать новичек, но основы ООП, Си++, РНР мне известны. Сейчас начал переделывать сайт из html в РНР и MySQL, но понял, что без JavaScript не обойтись.
Суть задачи:
У меня есть меню на сайте, которое формируется при помощи РНР и MySQL. Так же я сделал страницу, которая редактирует это меню, в частности меняет строки местами. По началу я сделал так: при нажатии кнопки "вверх" на определённой строке, то строка меняется местами с верхней, но механизм слишком медленный, т.к. изменения сначала заносятся в базу, а потом вытаскиваются оттуда и отображаются. Это конечно не практично и я хочу использовать JavaScript, который будет менять локально строки местами, а конечные изменения будут зафиксированы в БД нажатием кнопки "Сохранить" уже с использованием РНР.
В РНР я использовал массивы, т.к. количество пунктов меню может меняться и у меня не было проблем с именами элементов, например
<INPUT type='text' name='content[]' value='".$content[$i]."'> или почти тоже самое
<INPUT type='text' name='content[".$i."]' value='".$content[$i]."'>,
где каждому текстовому полю соответствовала своя переменная content[0], content[1],..., и т.д.
при попытке применить тоже самое к javascript:
<INPUT type='text' id='content[".$i."]' name='content[".$i."]' value='".$content[$i]."'>,
у меня выскакивает ошибка. Оказывается, что content[х]=undefined. Не буду описывать, что я пробовал, но результата я не добился и понял что имена элементов в JavaScript не могут быть массивами. Это так?
И как правильно осуществить взаимодействие между переменными в JavaScript и РНР?
Timpi вне форума Ответить с цитированием
Старый 04.07.2008, 15:12   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Взаимодействия как такого - нет из-за среды "обидания" скриптом - одни выполняются на серверной стороне, а другие - на клиентской. МОжно передать посредством РНР в джаваскриптовый код приблизительно так:
Код:
echo "<script>
             var a=5;
             var b=10;
             var c=$peremennaya;
             var d=".$peremennaya2.";
           </script>"
из PHP в JS "передать" можно только через запрос: или через аджакс, или же простым переходом:
Код:
window.location = "/index.php?id="  + my_id;
SkyM@n вне форума Ответить с цитированием
Старый 04.07.2008, 15:47   #3
Timpi
Пользователь
 
Аватар для Timpi
 
Регистрация: 20.10.2007
Сообщений: 29
По умолчанию

Мне бы наоборот из JavaScript в PHP перенести данные.
В PHP создаётся страница с таблицой в ячейках которой находятся текстовые поля (<INPUT type='text' name='content[]' value='".$content[$i]."'>) с данными из MySQL, которые надо поменять и в конце концов сохранить. Менять данные, в частности менять местами строки, хочется локально, не обращаясь к серверу (т.е. не использовать PHP) и только сохранить данные в MySQL при помощи PHP.
Чтобы поменять данные я буду использовать JavaScript и разультаты мне надо передать в PHP. Вот в чём вопрос.
И основная загвоздка в том, что количество строк в таблице (меню) может меняться, значит и количество текстовых полей будет меняться, а мне надо обратиться к тому или иному полю из JavaScript и поменять его значение. Для этого отлично подходят массивы:
echo "<INPUT type='text' id='content[".$i."]' value='".$content_123[$i]."'>",
но в этом случае я не могу изменить значение текстового поля из JavaScript обращением content[3]=(чего-то там),
могу только в этом случае:
echo "<INPUT type='text' id='content".$i."' value='".$content_123[$i]."'>",
обращением content3=(чего-то там), но это уже будет не массив и работать не удобно.

Последний раз редактировалось Timpi; 04.07.2008 в 16:56.
Timpi вне форума Ответить с цитированием
Старый 04.07.2008, 18:16   #4
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Я уже сказал выше, как передать данные - или полным запросом с перехродом, или аджаксом, что не требует перезагрузки страницы.
SkyM@n вне форума Ответить с цитированием
Старый 04.07.2008, 21:13   #5
Romanbl4
Форумчанин
 
Аватар для Romanbl4
 
Регистрация: 20.06.2007
Сообщений: 144
По умолчанию

Точно не знаю, будет ли это работать, не пробовал сам. Но возможно есть такой вариант:

Создаешь форму
Код:
<form id="saveconfig" name="saveconfig" method="post" action="saveconfig.php">
<input name="menu_item0" id="menu_item0" type="hidden" value="0" />
<input name="menu_item1" id="menu_item1" type="hidden" value="1" />
<input name="menu_item2" id="menu_item2" type="hidden" value="2" />
...
и т.д.
<input type="submit" name="save" id="save" value="Сохранить" />
</form>
где каждый скрытый(hidden) input соответствует какому-нибудь пункту меню, например menu_item0 - первому и т.д., а в value записываем порядковый номер пункта меню по очередности выдачи на экран. Форму создаем путем php, загружая данные из базы.

А вот при передвижении пункта меню menu_item0 вниз через javascript меняем местами значения соответствующих пунктов меню в соответствующих input:

Код:
tmp = document.saveconfig.menu_item0.value;
document.saveconfig.menu_item0.value = document.saveconfig.menu_item1.value;
document.saveconfig.menu_item1.value = tmp;
То есть параметры формы мы меняем без перезагрузки страницы, а потом эти параметры методом post (или get, как хотите ) отправляем в скрипт сохранения в базу путем нажатия кнопки submit "Сохранить".
Romanbl4 вне форума Ответить с цитированием
Старый 05.07.2008, 14:00   #6
Timpi
Пользователь
 
Аватар для Timpi
 
Регистрация: 20.10.2007
Сообщений: 29
По умолчанию

SkyM@n, что такое аджакс? И не совсем понял про переход.
Что делает этот код:
Код:
window.location = "/index.php?id="  + my_id;
, делает запрос на сервер? Я же хочу от этого отказаться и менять данные локально, а потом сохранить всё разом.

Romanbl4, я обдумывал этот вариант. А если я буду менять местами не самые верхние, а 2-ю и 3-ю строки местами, то мне надо написать функцию в 3 строки, но с другими цифрами?
А если у меня 15 пунктов в меню, то мне надо сделать 14 функций? :-)
А если я подобное захочу применить, скажем, к товарам из 200 пунктов?
многовато..... :-(
В ближайшем будующем я так и хочу сделать.
Опять поясню почему я хочу сделать обработку локально. Вы пробовали в беспорядочном меню навести порядок нажатием кнопок "вверх" ("вниз" я посчитал, что не надо делать) напротив пунктов, при этом каждое нажатие сохраняет данные на удалённом сервере, загружает их обратно и опять отображает? Думаю и не такое бывало у вас. Это можно сравнить с работой на Пне-133, в то время когда работаешь на двухядерном 2200. Мне надо, чтобы как можно более проще было обращаться тем или иным текстовым полям из JS и чтобы потом эти изменённые данные можно было передать в PHP. Возможно ли сделать в элементе в виде id=массив[номер] (или что-нибудь подобное, примеры писал выше) ? Если этот вариант возможен, то я думаю, что задачу решу, если нет, то как сделать по другому?
Вариант предложеный Romanbl4 мне нравится, но не нравится количество функций которые придётся составлять (хоть это и будет делать автоматически PHP), это сильно увеличит трафик и будет просто мусором! Хотя функции все однотипные! Не хватает у меня ещё знаний в JS, чтобы осуществить предложеный вариант и использовать при этом только 1 функцию. Подскажите.

Последний раз редактировалось Timpi; 05.07.2008 в 14:05.
Timpi вне форума Ответить с цитированием
Старый 05.07.2008, 21:13   #7
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Господа не слышали про рекурсию? Господа где вообще изучали программирование? Господа не знают теории алгоритмов?

Мне честно сейчас некогда за вас писать код, но я напишу как это осуществляется.
- создаётся массив, где ключ каждого элемента = ссылке на каждый пункт меню (это может быть цифра как часть id пункта меню или полный id)
- каждому элементу массива при создании страницы посредством PHP присвается определённое целое число, обуславливающее порядок данного пункта в меню.
- кнопки вверх-вниз-в начало-в конец, вызывают функцию, которой передаётся ключ в массиве и новое обозначение порядка данного элемента в меню.
- функция в свою очередь вызывает себя столько раз, сколько нужно, дабы сдвинуть все остальные элементы куда нужно и "подготовить" новое место для передвинутого пункта.
Фактически функция занимается тем, что изменяет циферки в массиве.
В конце работы и при нажатии кнопки "Сохранить", данный массив сериализуется и отсылается серверу. Сервер (PHP) десериализирует данную строку снова в массив, и уже обрабатывая данные из массива вносит их в БД.

Простейший скрипт сериализации и десериализации в PHP:
PHP код:
<?php
$a 
= array('a','b','c');
$b serialize($a);
echo 
$b;
$c unserialize($b);
print_r ($c);
?>
Конечно, можно написать и свою функцию сериализации.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 05.07.2008, 22:53   #8
komex
Пользователь
 
Регистрация: 16.12.2006
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Timpi Посмотреть сообщение
Мне бы наоборот из JavaScript в PHP перенести данные.
В PHP создаётся страница с таблицой в ячейках которой находятся текстовые поля (<INPUT type='text' name='content[]' value='".$content[$i]."'>) с данными из MySQL, которые надо поменять и в конце концов сохранить. Менять данные, в частности менять местами строки, хочется локально, не обращаясь к серверу (т.е. не использовать PHP) и только сохранить данные в MySQL при помощи PHP.
Чтобы поменять данные я буду использовать JavaScript и разультаты мне надо передать в PHP. Вот в чём вопрос.
И основная загвоздка в том, что количество строк в таблице (меню) может меняться, значит и количество текстовых полей будет меняться, а мне надо обратиться к тому или иному полю из JavaScript и поменять его значение. Для этого отлично подходят массивы:
echo "<INPUT type='text' id='content[".$i."]' value='".$content_123[$i]."'>",
но в этом случае я не могу изменить значение текстового поля из JavaScript обращением content[3]=(чего-то там),
могу только в этом случае:
echo "<INPUT type='text' id='content".$i."' value='".$content_123[$i]."'>",
обращением content3=(чего-то там), но это уже будет не массив и работать не удобно.
Надо средством JavaScript поменять значение текстового поля? Может это сделать так?
Код:
for (i = 0; i < 5; i++) {
document.getElementById('content['+i+']').value="Нужное значение ";
}
В итоге все поля с именами content[0], content[1], content[2], content[3], content[4] будут иметь значение "Нужное значение". Ну а потом уже, по нажатии на кнопку, отправлять данные на сервер к php и mysql.

Последний раз редактировалось komex; 05.07.2008 в 22:56.
komex вне форума Ответить с цитированием
Старый 06.07.2008, 05:39   #9
Timpi
Пользователь
 
Аватар для Timpi
 
Регистрация: 20.10.2007
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Господа не слышали про рекурсию? Господа где вообще изучали программирование? Господа не знают теории алгоритмов?
Signor Johnatan, lesse quel topic attento? *

komex, твой вариант обращается к элементам как к массивам? У меня как раз с этим и проблема. Мне не удаётся сопоставить элемент массива с элементом формы. Посмотрю можно ли использовать document.forms[] или document.all

Ещё раз:
Вы все прекрасно рассказываете о массивах. Мне о них столько же известно (не в обиду будет сказано). О рекурсии мне тоже известно только не понятно в каком месте её применять.
Вопрос в большей части по языку (или по связке 2-х языков).
При помощи PHP делаю любую страницу. Если делаю
PHP код:
echo "<INPUT type='text' id='content[".$i."]' value='".$content_123[$i]."'>"
то например сформированое поле не работает:
PHP код:
<INPUT type='text' id='content[3]' value='5'
функция alert(content[3]) даёт "undefined".
Как заставить JS воспринимать обращения к элементу через массив?
Например, чтобы alert(content[3].innerText) давало "5".

Вот нерабочий пример, который легко можно сделать рабочим следуя коментариям в коде.
PHP код:
<script language="JavaScript">
var counter = 0;
result_id = new Array();             //Удалите эту строку

function change_val(change)
{
  change ? counter++ : counter--;
  alert(counter);                    //Не нужная строка, вставлена только для показухи
  alert(result_id[0].innerText);     //Удалите эту строку
  result_id[0].innerText = counter;  //Удалите [0]
  counter_id.innerHTML = "<input type=hidden name=counter value=" + counter + ">";
}

</script>
</head>

<body>

<span onClick="change_val(false)">-</span>
<span onClick="change_val(true)">+</span>

&nbsp;&nbsp; Result: <span id=result_id[0]>Пусто</span> <!-- // Удалите [0] -->

<form method=POST>
  <span id=counter_id></span>
  <input type=submit>
</form>

</br></br>

<?php
if (isset($_POST['counter']))
  echo 
"Recieved data: counter = " $_POST['counter'];
?>

</body>
</html>
сделайте его рабочим, но не убирайте [0], т.е. чтобы в теге осталось id=result_id[0].

P.S. * Господин Johnatan, вы внимательно прочитали топик? (итальянский).
Я завёл этот топик не потому что у меня не получается написать программу или алгоритм обработки, а потому что у меня пробелы в знании языка JavaScript, которые не дают создать оптимальный алгоритм и по нему составить программу.
Timpi вне форума Ответить с цитированием
Старый 06.07.2008, 12:50   #10
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Как насчёт уберать квадратные скобки? А в массив передавать ВСЕ имена полей? Я же написал...
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
взаимодействие с QIP Toxa Общие вопросы Delphi 5 20.06.2008 19:39
Что то не так с переменными.. adwaer Помощь студентам 1 19.06.2008 08:42
Работа с переменными в DLL Zeraim Общие вопросы Delphi 3 14.05.2008 23:10
Взаимодействие форм mauar Общие вопросы Delphi 7 05.05.2008 11:36
Взаимодействие с виндой и еще кое-что Manitu Помощь студентам 5 25.03.2008 09:28