Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Редактирование массива с помощью инструментов javascript (https://javascript.ru/forum/jquery/58890-redaktirovanie-massiva-s-pomoshhyu-instrumentov-javascript.html)

type 15.10.2015 18:49

Редактирование массива с помощью инструментов javascript
 
Здравствуйте! Я новичок в области web-разработки и только недавно стал сталкиваться с jquery и подобными инструментами. Плохо то, что везде про это пишут разными словами и разными способами, вызывая в голове полнейшую кашу. Надеюсь встретить здесь настоящих профессионалов, которые наставят на истинный путь. Теперь перейду к сути моего вопроса:
есть массив заданий
$question=array(
1=>array(
0=>'T',
1=>'Вопрос 1',
'answer'=>array(
1=>'Вариант ответа 1',
2=>'Вариант ответа 2',
3=>'Вариант ответа 3',
4=>'Вариант ответа 4',
5=>'Вариант ответа 5'
),
'true_answer'=>array(
1=>3
)
),
2=>array(
0=>'T',
1=>'Вопрос 2',
'answer'=>array(
1=>'Вариант ответа 1',
2=>'Вариант ответа 2',
3=>'Вариант ответа 3',
4=>'Вариант ответа 4',
5=>'Вариант ответа 5'
),
'true_answer'=>array(
1=>4
)
),

и так далее. В коде визуализации я вывожу его таким образом:
<?
$k = 1;
foreach($question as $quest){
?>
<table align="center" cellpadding="2" cellspacing="1" width="100%" bgcolor="#000000">
<tr>
<td vAlign="top" bgcolor="#ffffff" style="padding:8px">
<div><strong><?=$quest[1]?></strong><p></div><?
?>Варианты ответов:<p><?
foreach($quest['answer'] as $ans){

?><div><?print('<name="answer">'.$ans.'')?></div><?
}
?><div align="center"><?
print('<input type="button" name="var" id="button'.$k.'" value="Редактировать вопрос" />'); 
?></div>
</td>
</tr>
</table><p><p><?
$k++;

};

?>

Хочется, чтобы при нажатии кнопки(для конкретного вопроса) вылазила форма(с заполненными полями для конкретного вопроса), подобно этой:
div id="dialog-form" title="Edit Question">
<p class="editQuestion"></p>
<form>
<fieldset>
<label for="name"></label>
<input type="text" name="name" id="firstOption" value="" >
<label for="name"></label>
<input type="text" name="name" id="secondOption" value="" >
<label for="name"></label>
<input type="text" name="name" id="thirdOption" value="">
<label for="name"></label>
<input type="text" name="name" id="fourthOption" value="">
<label for="name"></label>
<input type="text" name="name" id="fifthOption" value="">
<input type="submit" tabindex="-1" style="position:absolute; top:-1000px">
</fieldset>
</form>
</div>
и нажав, например, кнопку сохранить варианты ответов в массиве автоматически изменялись на значения полей в форме. Надеюсь на помощь. Критика кода приветствуется.

laimas 15.10.2015 19:00

Вылазила? :)

Форму у сервера можно запросить без перезагрузки текущей станицы, а можно и перегрузив ее, и как надо?. А чтобы получить нужное, достаточно передать серверу первичный ключ массива.

PS. редактирование массива, вернее изменение его значений это ладно, а вот как вы собираетесь сохранять эти изменения?

type 15.10.2015 19:30

Нет, форма не вылазила. Это я просто для примера показал. Хотелось бы без перезагрузки, чтобы можно было нажать сохранить и эти изменения отобразились. А в чем проблема с сохранением изменений? Я что-то совсем не в теме :(

laimas 15.10.2015 20:03

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

<input type="text" name="name" id="firstOption" value="" >
....
<input type="text" name="name" id="fifthOption" value="">

будет получено одно единственное значение - значение последнего поля. Для того чтобы получить все и под одним именем, это имя должно отражать массив:

<input type="text" name="name[1][1]" id="firstOption" value="" >
....
<input type="text" name="name[1][5]" id="fifthOption" value="">

Здесь каждому полю принудительно заданы индексы массива соответствующие ключам вопросов, а первичный ключ равен блоку вопросов (иначе можно было бы так name[]). Тогда получив поля формы "отредактировать" массив будет просто:

if(isset($_POST["name"])) {
    $k = key($_POST['name']);
    array_replace($question[$k]['answer'], $_POST['name'][$k]);
}


А что дальше? Если этот массив нужен на время сессии, то можно его хранить в сессии, но зачем тогда его править? Если же это "база" задач, значит хранить нужно в файле, а еще лучше в базе. Если в файле, то в JSON формате, но учитывать, что функции JSON работают только с utf.

Так что ваш скрипт вряд ли должен начинаться с "есть массив заданий". Сперва надо это сделать, а уж затем чтобы "вылазило". )

PS. Идентификаторы в данном случае совсем не нужны, их используют по потребности, а не потому, что так положено.

type 15.10.2015 20:47

Это "база" задач и они хранятся в файлах.

type 15.10.2015 21:00

laimas, Вы просто мой вопрос не поняли. Что делать с массивом я дальше разберусь. Мой основной вопрос в том, как сделать, чтобы для каждого отдельного вопроса открывалась своя форма для редактирования и сохраняла его.

рони 15.10.2015 21:25

type,
на тему
http://javascript.ru/forum/misc/5324...tml#post353762

laimas 15.10.2015 21:48

Сперва надо с представлением данных разбираться, думать над этим, а затем вызывать формы, ибо в вопросе есть и "сохраняла его". Я то все понимаю, а вы нет "новичок в области web-разработки", например, даже если бог с ним что вы там с массивом делать будете:

1) структура его неудачная;
2) вы не представляете, что вам нужно делать с данными ни клиенте, ни на севере, и это вытекает из 1, и представления формы.

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

Например, форму готовую может отдать сервер, а может и только данные для нее, как значения, а сам html-код формы уже будет построен на клиенте по этим данным. Кроме этого данные на сервере надо будет еще и проверять, и реагировать на ошибки.

Ну а если вы считаете, что это чепуха, и главное это показать форму, ну так:

Вот так, к примеру, на странице должны выглядеть кнопки:

<input type="button" id="choice-1" value="Редактировать вопрос" />

имен им не нужно. Число в имени id, это блок вопросов. Запрос формы этими кнопками:

$(function() {
    $('[id|=choice]').click(function() {
        $.post(url, this.id.replace('-','='), function(d) {
            //d - ответ сервера, какой он будет, какой нужен, я не знаю, читайте выше
            //если готовая форма, то поместить ее код в ...?    
        })
    });
}


На сервере по клику получите $_POST['choice'];

Это простой Ajax запрос jQury. Соответственно и отправлять форму можно Ajax запросом.

Вот в принципе суть того, чего вы хотите, а конкретно как.... это уж вам виднее.


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