Как создать форму для 2D / многомерной таблицы? - PullRequest
0 голосов
/ 12 октября 2009

Мне нужно создать форму в CakePHP, чтобы пользователи могли вводить данные (числа) в ячейки, показанные в таблице ниже. Экран ввода должен выглядеть как таблица, показанная ниже. Пользователи должны иметь возможность выбрать любую ячейку, которую они хотят ввести / обновить значение, затем введите значение, нажмите «Отправить» и отправьте значение / значения. Каждая «Метрическая секция (например, Метрика А, Метрика Б ..)» будет иметь кнопку отправки, чтобы пользователи могли редактировать / обновлять каждую секцию в таблице.

 ___________________________ ____________________
|___     ___|___2006_______|__2007____|___2008___|
|_METRIC A__|______________|__________|__________|
| item A1   |          1   |    5     |    7     |
| item A2   |         15   |   18     |   21     |
| item A3   |          3   |    6     |   11     | 
| item A4   |          1   |    1     |    3     |
|___________|______________|__________|__________|
|_METRIC B__|______________|__________|__________|
| item B1   |         12   |   18     |   31     |
| item B2   |          1   |    4     |    6     | 
| item B3   |          0   |    0     |    2     |
--------------------------------------------------

Как видите, каждый метрический раздел представляет собой двумерную таблицу. Поэтому я хотел бы захватить входные данные в 2D-массив. В настоящее время я успешно создал отображение данных (что было намного проще). Я просто создал массив метрик, который представляет собой массив двумерных массивов. Затем я передал этот массив двумерных массивов в файл представления для отображения таблицы.

Я немного растерялся, как получить пользовательский ввод для этой таблицы. У кого-нибудь был подобный опыт? Любое предложение будет очень полезно для меня.

Ответы [ 2 ]

1 голос
/ 12 октября 2009

Возможно, вы захотите начать исследовать некоторые сеточные решения Javascript с возможностями редактирования. На ум приходит Ext, но наверняка найдутся альтернативы для вашего фреймворка JavaScript (например, jQuery). Это будет обрабатывать все качества onclick на стороне клиента, предоставляя вам возможность выполнить действие AJAX, в которое форма может отправлять данные. Там вам решать, какие модели вы обновляете для каждой части данных.

0 голосов
/ 01 декабря 2011

Если это кому-нибудь пригодится, я выкладываю свое решение здесь.

Мне удалось решить эту проблему с помощью «Параллельные двумерные массивы».

Это просто трюк. Вы создаете 2D массив для отображения данных. Таким образом, у вас есть массив для каждой строки в таблице. Например, если столбцы «Год 2006», «Год 2007» и «Год 2008», как в моем вопросе выше. Вы создадите строку данных со значением для каждого года.

$data_for_row_array = array('10', '15', '35');

Таким образом, вы создаете массив данных для каждой строки в вашей таблице и получаете массив строк:

$rows_array = array(data_for_row_1_array,  data_for_row_2_array, ..) etc

Это будет сделано для массива отображения. Теперь, если вы хотите захватить пользовательский ввод для каждой из этих ячеек в таблице, все, что вам нужно сделать, это создать аналогичный второй 2D-массив с идентификаторами каждой ячейки данных, взятой из база данных .. если идентификатор еще не существует, просто оставьте его пустым. И когда пользователь вводит данные и отправляет их, просто переберите два 2D-массива и используйте идентификатор из одного массива и данные из другого массива, чтобы сопоставить их. потому что в обоих массивах совпадающий идентификатор и его значение данных будут в одной и той же позиции. Поэтому, если вы найдете и «ID» в «массиве идентификаторов», и значение данных в той же позиции в «массиве данных», вы просто используете его для обновления таблицы базы данных. Это концепция «параллельных двумерных массивов».

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

Надеюсь, это даст вам некоторое представление ... если неясно, просто дайте мне знать, и я объясню это более подробно.

...