Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача массива из PHP в JS. (https://javascript.ru/forum/misc/65154-peredacha-massiva-iz-php-v-js.html)

St. 30.09.2016 10:38

Передача массива из PHP в JS.
 
Если передать переменную можно так
То как передать массив?

Делаю так:
$abcd = array('Массив 0', 1, 2);
echo '<form action="' . $url . '" method="post" name="FormRegistration" onsubmit="return RegistrationValid(\'' . $abcd . '\');">';

alert выдает: array

Помогите сделать это правильно.

warren buffet 30.09.2016 10:58

json_encode()

warren buffet 30.09.2016 11:03

И вообще ты все неправильно делаешь. Валидация относится не к форме, а к полям формы. Чтобы написать более-менее абстрактный валидатор, тебе надо в поля записывать правила их проверки. Сейчас это можно сделать через атрибут поля pattern. Более того, есть встроенная в браузеры валидация, но там как-то туманно все.

Потому что формой регистрации твоя задумка не ограничится. Где регистрация, там и смена пароля, редактирование профиля и все такое и повсюду нужна валидация. Ты на каждую форму будешь писать ее личный валидатор?

laimas 30.09.2016 11:04

Можно так:
$abcd = json_encode(array('Массив 0', 1, 2));
echo "<form action=\"$url\" method=\"post\" name=\"FormRegistration\" onsubmit='return RegistrationValid($abcd )'>";


onsubmit="function_name();" - одно выражение, значит и точка с запятой в общем то не нужна.

Но если судить по передать переменную можно так, а теперь как впихнуть массив, то это наводит на мысль, что вы что-то не так делаете.

St. 30.09.2016 11:08

Спасибо warren buffet.

Делаю так:
$abcd = array(1,2,3);
$abcd = json_encode($abcd);
echo '<form action="' . $url . '" method="post" name="FormRegistration" onsubmit="return RegistrationValid(\'' . $abcd . '\');">';


В js делаю так:
massiv = JSON.parse(abcd);
alert(massiv[0]);

Работает.

А как передать такой массив?
$abcd = array('1','2','3');


addslashes - не помогает...

warren buffet 30.09.2016 11:09

Например на сайте может быть открыто одновременно считай сколько форм:

Профиль
Перезвонить
Фидбэк
Быстрая покупка
Оформление корзины

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

warren buffet 30.09.2016 11:11

Цитата:

Сообщение от St.
В js делаю так:

В js уже объект, браузер его сам отпарсил и скомпилил, поскольку текст в хтмле.

warren buffet 30.09.2016 11:12

Просто у функции RegistrationValid должен быть параметр

function RegistrationValid(params){

/* Все что json_encode() отпостил, и будет в params*/

}


PS Может быть будет не объект, а массив. Если ключей нет, то есть когда они континуально индексные, json_encode() кажется делает массив, почитай документацию.

laimas 30.09.2016 11:14

Цитата:

Сообщение от St.
А как передать такой массив?
$abcd = array('1','2','3');

Я вам для чего писал пример? Обратите внимание на кавычки в строке. Почему так? Все потому, что в JSON строки заключаются в двойные кавычки. То что я написал даже не потребует JSON.parse на клиенте. А почему - ответ можно найти если щелкнуть F12 и заглянуть в отладчик.

warren buffet 30.09.2016 11:19

Цитата:

Сообщение от laimas
а теперь как впихнуть массив

А как ты сделаешь 5 объектов для 5 форм без передачи параметров в объекты, хотя бы таких как id формы, редактируемая она или нет, плавает или пофиксена, нужно ли напоминать о несохраненных данных или пофигу? Откуда взять все эти параметры? В атрибуты распихивать? Ну распихивай.

warren buffet 30.09.2016 11:21

Если перенести рендер в браузер, то вообще ничего кроме массива не придется выводить ни в хтмл, ни в аякс.

laimas 30.09.2016 11:21

warren buffet,
Еще раз послать тебя, где твое место? Нет? Тогда заткнись и не лей помои в теме, если не соображаешь о чем речью. Хватит пустых лозунгов.

warren buffet 30.09.2016 11:26

laimas, опять у тебя пукан бомбанул. )))

warren buffet 30.09.2016 11:31

St., в html'е должно быть так (если я правильно помню как работает json_encode):

return RegistrationValid(['Массив 1', 2, 3])

или так

return RegistrationValid({0:'Массив 1', 1:2, 2:3})

в общем примерно так

Браузер компилит текст в объект сам, а если у тебя вот так

return RegistrationValid('{0:'Массив 1', 1:2, 2:3}')

то на входе функции строка и ее, еще надо отпарсить и превратить в объект. Зачем, если браузер все сам сделает, это же не аякс запрос, это html который парсится весь.

laimas 30.09.2016 11:33

warren buffet,
ты дебил. Ты вылил в теме кучу помоев. Ты просто паскудишь в темах, более от тебя ничего путнего. Натура у тебя такая быть затычкой в каждую задницу.

А посему ты выглядишь полным придурком, хотя пытаешься позиционировать себя гением во всех без исключения вопросах. Чмо тупое.

warren buffet 30.09.2016 11:36

laimas, допросился


St. 30.09.2016 11:40

Уважаемые!
Помогите передать массив. Как это сделать?
"F12" - о каком отладчики идет речь? У меня Opera...
Объесните!
Кончайте ругаться...

warren buffet 30.09.2016 11:42

St., какой еще массив? Ты до сих пор не передал? Просто не делай лишнего. Тема давно уже про то, как у лалки пукан бомбанул. )))

warren buffet 30.09.2016 11:44

Вот как сделай

echo '<form action="' . $url . '" method="post" name="FormRegistration" onsubmit="return RegistrationValid(' . json_encode(array('Массив 0', 1, 2)) . ');">';


А на js просто берешь аргумент функции и все.

laimas 30.09.2016 11:52

Цитата:

Сообщение от St.
"F12" - о каком отладчики идет речь? У меня Opera...

Отладчик браузера. Там можно и просмотреть все. Самый простой способ увидеть исходный HTML без отладчика, это выбрать в контекстном меню браузера "Исходный код страницы".

Вся проблема в кавычках, когда вы пытаетесь "вогнать" строку в кавычки. И хотя то, что вы делаете, подсказывает, что делаете вы не то или не так, все же возникают иногда обстоятельства вставить в атрибут нечто, что порождает конфликты. Но в этом случае вставляемое можно закодировать, а на клиенте раскодировать перед использованием. Вот пример с тем же JSON:

$a = rawurlencode(json_encode(['aaa', 'ddd']));
echo '<button onclick="alert(JSON.parse(decodeURIComponent(\''.$a.'\')))">GO</button>';

St. 30.09.2016 13:57

Уважаемые, спасибо.
Получилось вот так (php):
$massiv = array('Текст 0', 'Текст 1', 234, 546);
$encodemassiv = rawurlencode(json_encode($massiv));
echo '<form action="' . $url . '" method="post" name="FormRegistration" onsubmit="return RegistrationValid(\'' . $encodemassiv . '\');">';


Функция на js:
function RegistrationValid(encodemassiv)
{
massivjs = JSON.parse(decodeURIComponent(encodemassiv))
alert(massivjs[0]);
alert(massivjs[1]);
alert(massivjs[2]);
alert(massivjs[3]);
}


warren buffet.
Цитата:

Сейчас это можно сделать через атрибут поля pattern. Более того, есть встроенная в браузеры валидация, но там как-то туманно все.
Кто такие pattern? У вас есть справочная информация о них (можно с примерами)?

laimas 30.09.2016 14:24

Цитата:

Сообщение от St.
Получилось вот так

Вы так и не поняли в чем собственно проблема. Если у вас РНР не ниже версии 5.4, то уберем юникод из JSON.

$json = json_encode(['Текст 0', 'Текст 1', 234, 546], JSON_UNESCAPED_UNICODE);
//результат будет такой
//["Текст 0","Текст 1",234,546]
//вставляем как есть в вывод
echo '<button onclick=\'myF(' . $json . ')\'>GO</button>';


Если это просмотреть в отладчике, то html будет таким

<button onclick="myF(["Текст 0","Текст 1",234,546])">GO</button>

Скопируйте в отладчике (в Опере выберите Инструменты разработчика) и получите

<button onclick="myF([&quot;Текст 0&quot;,&quot;Текст 1&quot;,234,546])">GO</button>

Другими словами в нативном обработчике для передачи в функцию уже прописан массив, а в функции сразу обращаемся к его элементам.

function myF(d) {
    alert(d[1])
}




О новых возможностях форм можно почитать здесь и здесь.

warren buffet 30.09.2016 14:42

Цитата:

Сообщение от St.
rawurlencode

Это зачем? У тебя вообще php в UTF-8 или в какой-нить анзи-шманзи вин-1251? json_encode() работает только с юникодом нормально.

warren buffet 30.09.2016 14:44

Цитата:

Сообщение от St.
У вас есть справочная информация о них


У меня все есть http://www.html5pattern.com/


Судя по тому, что тебе двое человек три страницы не смогли вталдычить самое элементарное, боюсь лучше не мучиться с паттернами и объектными валидаторами. Продолжай как смошешь.

laimas 30.09.2016 14:48

Цитата:

Сообщение от warren buffet
Это зачем? У тебя вообще php в UTF-8 или в какой-нить анзи-шманзи вин-1251?

rawurlencode, это URL-кодирование строки согласно RFC 3986 и к какой либо кодировке не привязана.

warren buffet 30.09.2016 15:02

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

laimas 30.09.2016 15:30

Цитата:

Сообщение от laimas
json_encode все сам делает, стопудово.

Значит и ты ничего не понимаешь.

St. 30.09.2016 16:03

laimas.
В отладчике смотрел, получилось...
Спасибо.

П.С.
Хух...
pattern посмотрю завтра.

laimas 30.09.2016 16:07

St.,
обязательно нужно знать это, а знание формата данных, в данном случае JSON, передачи аргументов в js-функции (и не только в них), уже на этапе написания этого кода даст представление конечного результата. Не надо действовать наобум - я привел пример с кодированием, а вы его сразу ..., а ведь в данном случае это лишнее. ) Это нужно будет для очень "тяжелых" случаев.

St. 30.09.2016 20:41

Спасибо за:
Сумасшедшие формы (что нового в <form>)
Автоматическая проверка форм (pattern)
Определение строк в PHP (одинарные кавычки, двойные кавычки и др.)

warren buffet 01.10.2016 05:11

Цитата:

Сообщение от laimas
Значит и ты ничего не понимаешь.

Хочу понять, разъясни зачем rawerlencode фтыкать.


Часовой пояс GMT +3, время: 01:34.