#javascript #php #arrays #bootstrap-modal #filemaker
#javascript #php #массивы #bootstrap-модальный #filemaker
Вопрос:
У меня есть этот массив, который я сгенерировал в PHP и сохранил в переменной с именем «$auction_additionalrevenues». С помощью указанного массива я сгенерировал очень хорошую таблицу данных с использованием bootstrap.
Моя конечная цель — позволить пользователю щелкнуть строку в указанной таблице данных, а затем использовать модальный, чтобы разрешить им редактирование (затем затем создайте строку в таблице).
Я делал это много раз, используя FileMaker в качестве источника БД, где строки в таблице являются «связанными данными» или дочерними записями родительской записи, которую просматривает пользователь. На этот раз данные не связаны, а скорее находятся в самой родительской записи в «повторяющихся полях», из которых я создал многомерный массив.
Что я, похоже, не могу понять в данном конкретном случае, так это то, как показать пользователю данные в модели для конкретной строки, которую они щелкнули. Это расстраивает, потому что у меня есть ВСЕ данные в этом многоплановом (или вложенном?) Массив PHP, хранящийся в глобальной переменной. Другими словами, мне не нужно возвращаться к базе данных, чтобы получить эти данные, поскольку они уже есть в массиве / переменной.
Как мне передать все эти данные между отображаемой страницей / Javascript / PHP? Я могу легко повторить запись / строку в JS с помощью «onclick», как показано ниже.
onClick=showadrev()
Когда я это делаю, я могу записать $ mkey ($ mkey = index / row) в журнал консоли или предупредить об этом без проблем.
Затем я хочу, чтобы это модальное всплывающее окно показывало массив, вложенный в этот индекс / строку.
Вот мой массив:
Array
(
[0] => Array
(
[0] => Raffle
[1] => Pick of Live
[2] =>
[3] => 100
[4] => 150
[5] => Cocktail Only
[6] => Struggled a bit, offered some from the stage to hit the minimum
)
[1] => Array
(
[0] => Raffle
[1] => Ticket/Tangible
[2] => $1000 gift certificate to Canlis
[3] => 25
[4] => Unlimited
[5] => Cocktail Only
[6] => Really don't know how this did, but the box was pretty full of tickets
)
[2] => Array
(
[0] => Game
[1] => Ticket/Tangible
[2] => The Horse Race. Everyone is a winner. Receive a gift certificate ranging from $25 to $99.
[3] => 25
[4] => Unlimited
[5] => Cocktail Only
[6] => Great participation
)
[3] => Array
(
[0] => Other
[1] => Mystery/ Blind Pull
[2] => Wine Pull
[3] => 25
[4] => 50
[5] => cocktail only
[6] => There was about a dozen or so left
)
[4] => Array
(
[0] => Other
[1] => Ticket/Tangible
[2] => Centerpiece sales
[3] => 25
[4] => 35
[5] => Pre amp; During
[6] => Unknown
)
)
И вот таблица данных, которую я визуализирую:
<div class="wizard-step-3">
<fieldset>
<legend class="pull-left width-full">Aditional Revenue</legend>
<!-- <div class="table-responsive"> -->
<table id="data-table" class="table table-bordered table-striped" width="100%">
<thead>
<tr>
<th>Item</th>
<th>Type</th>
<th>Title</th>
<th>Price</th>
<th>Total Available</th>
<th>Sold By</th>
<th>Description</th>
<th>How did it Go?</th>
</tr>
</thead>
<tbody>
<?php foreach ($auction_additionalrevenues as $mkey => $adrevitems){
$no = $mkey 1;
?><tr style="cursor:pointer;" onClick=showadrev(<?php echo $mkey ; ?>)><?php;
echo '<td>'.$no.'</td>';
echo '<td>'.$adrevitems[0].'</td>';
echo '<td>'.$adrevitems[1].'</td>';
echo '<td>'.$adrevitems[3].'</td>';
echo '<td>'.$adrevitems[4].'</td>';
echo '<td>'.$adrevitems[5].'</td>';
echo '<td>'.$adrevitems[2].'</td>';
echo '<td>'.$adrevitems[6].'</td>';
echo '</tr>';
} ?>
</tbody>
</table>
<!-- </div> -->
</fieldset>
</div>
Комментарии:
1. Если я передаю массив непосредственно в JS (вместе с «mkey») без json_encode, я получаю «Неперехваченную синтаксическую ошибку: неожиданный токен u в JSON в позиции 0», и все же, если я передаю его в JS с помощью json_encode, я получаю «Неперехваченную синтаксическую ошибку: недопустимый или неожиданный токен» в журнале консоли.
2. Вы спрашиваете, как поместить весь массив в переменную javascript? например
var data = [[Raffle,..],....]
3. кроме того, если я предупреждаю о «typeof», я получаю «Функцию»
4. Спасибо ArtisticPhoenix! Я готов передать весь массив в JS, но с этим тоже не повезло. Я хочу, чтобы пользователь щелкнул третью строку в таблице dat и получил модель, в которой они могут редактировать данные для этой строки. Кажется, я могу правильно передавать эти данные.
5. Вы можете сделать это, если это так
var data = <?php echo json_encode( $array ); ?>;
, это должно быть нормально, если у вас нет возвратов строк в ваших данных.
Ответ №1:
Вы можете сделать что-то вроде этого
<script type="text/javascript" >
var data = <?php echo json_encode( $array ); ?>;
</script>
Данные в формате json будут выглядеть следующим образом
[["Raffle","Pick of Live","",100,150,"Cocktail Only", "Struggled a bit, offered some from the stage to hit the minimum"], .... ]
Который будет / должен быть допустимым массивом Javascript, если в нем нет возврата строки. Вы захотите убедиться, что ваш код не в формате json содержит что-то вроде false, если вы извлекаете его из базы json_encode(false)
данных вместо фактического массива.
Итак, если вы вставите это на страницу, вы в основном получите что-то вроде этого.
<script type="text/javascript" >
var data = [["Raffle","Pick of Live","",100,150,"Cocktail Only", "Struggled a bit, offered some from the stage to hit the minimum"], .... ];
</script>
Я не уверен, что это то, что вы хотите, хотя вы также можете добавить его в таблицу, используя атрибут data следующим образом
<td class="data_row" data-array="<?php echo implode(',', $array[0]); ?>" >
Затем вы можете получить его, выбрав этот td, извлекая данные и используя split.
var rowData = $('td.data_row').data('array').split(',');
Implode превратит его в список, разделенный запятыми, а split аналогичен explode в PHP, чтобы превратить его обратно в массив. Хотя я не совсем уверен, что вы можете поместить массив непосредственно в атрибут data (хотя я сомневаюсь в этом) и избежать этого.
Если вам тоже нужны ключи, это немного сложнее, потому что в JS они будут объектами, но в этом случае вам нужно сначала извлечь их из базы данных или что у вас есть. ( ассоциативный массив против объекта JS)
В качестве альтернативы с имеющейся у вас структурой вы могли бы сделать что-то подобное с помощью jQuery,
$('tr.row').click( function(event) {
var rowData = [];
$(this).find('td').each( function(i,v){
rowData.push($(this).text());
});
//do somthing with rowData
});
Что в основном заключается в том, чтобы найти строку (добавлен класс row, чтобы упростить ее), затем найти все дочерние td, затем выполнить цикл и добавить текст в них в массив.
Комментарии:
1. Имейте в виду, что в итоге вы можете получить такой JavaScript:
var data = ;
который приведет к сбою вашего приложения из-за синтаксической ошибки.2. Конечно, но маловероятно, что он пришел из БД, вы можете просто сделать
$array = []; while( $row = $PDO->fetch(PDO:FETCH_ARRAY)){ $array [] = $row; }
, тогда их всегда будет массивом по умолчанию, даже если он пустой. 🙂 Но это то, что нужно проверить в PHP перед началом работы. Я только что добавил немного для этого, спасибо!3. Именно моя точка зрения. Вы делаете слишком много предположений о сгенерированном PHP-коде
$array
. Я думаю, что более оборонительным подходом при передаче его в JS было бы защитить его и доказать, что JS никогда не выйдет из строя из-за этого…
Ответ №2:
Ответ Artistics должен быть принятым ответом на это. Вот как я это реализовал.
//echo $system_id;
//echo $system_auth_id;
print_r(json_encode($AuthData));
Я оставил закомментированный материал, чтобы вы видели, что я делал, прежде чем я прочитал это и понял, что мне нужно закодировать на стороне PHP перед отправкой в мое JS-приложение.
Результат:
[{"system_id":"61a694d0-3605-4502-952b-38d87b451a56","system_auth_id":"caa5906f-d9ae-4297-8e9f-5ea8d9ed8b51","system_lastauth_id":"ace681bb-48f5-4831-a23d-6608c696f264","system_rundate":"2019-04-27T22:46:07.090Z","system_auth_lastrundate":"2019-04-27T22:45:57.932Z","system_auth_updated_func":"main_init_auth_extend","system_auth_lastupdateddate":"2019-04-27T22:45:57.932Z","system_auth_lastupdated_func":"main_init_auth_extend","system_auth_request":"0","system_auth_request_lastfunc":"n/a","system_auth_denials":"0","system_auth_denial_lastfunc":"n/a","system_auth_success":"0","system_auth_success_lastfunc":"n/a"}]
Предыдущий результат:
Array( [0] => stdClass Object ( [system_id] => 61a694d0-3605-4502-952b-38d87b451a56 [system_auth_id] => caa5906f-d9ae-4297-8e9f-5ea8d9ed8b51 [system_lastauth_id] => ace681bb-48f5-4831-a23d-6608c696f264 [system_rundate] => 2019-04-27T22:46:07.090Z [system_auth_lastrundate] => 2019-04-27T22:45:57.932Z [system_auth_updated_func] => main_init_auth_extend [system_auth_lastupdateddate] => 2019-04-27T22:45:57.932Z [system_auth_lastupdated_func] => main_init_auth_extend [system_auth_request] => 0 [system_auth_request_lastfunc] => n/a [system_auth_denials] => 0 [system_auth_denial_lastfunc] => n/a [system_auth_success] => 0 [system_auth_success_lastfunc] => n/a ) )