Здравствуйте! Существует таблица которая выводится из базы данных в php скрипт, как сделать так что бы в ней можно было по желанию добавлять новые столбцы или прятать уже существующие? Заранее спасибо!
Pris в большинстве случаев это делается на javascript. даже простейшая реализация лёгкой не будет, т.к. по большей части веб предназначен для работы только с одной формой за раз, а не с таблицей. Большего количества кода потребуется и на серверной стороне для того, чтобы учесть особенности редактирования таблиц.
А в меньшенстве случаев это можно реализовать на php? Я ведь и php то плохо знаю, а о программировании на javascript и мечтать не могу.
PHP будет задействован в любом случае, т.к. это серверная часть, отдающая контент. В зависимости от требований задача будет находится в диапазоне от средне-тяжёлой до невероятно сложной с кучей ограничений. С учётом и задача кажется невыполнимой. Давай рассмотрим редактирование таблицы из двух элементов, каждый из которых содержит поля id, title, content: HTML: <form method="post" action="save.php"> <table> <tr><th>TITLE</th><th>CONTENT</th></tr> <tr> <td> <input type="hidden" name="id" value="1"> <input type="text" name="title" value="First title"> </td> <td> <textarea name="content">Content of first element</textarea> </td> </tr> <tr> <td> <input type="hidden" name="id" value="2"> <input type="text" name="title" value="Second title"> </td> <td> <textarea name="content">Content of second element</textarea> </td> </tr> </table> <input type="submit" value="save"> </form> и первая ожидающая засада - названия элементов. У нас несколько элементов с названием title, content, id, который будут перезаписывать друг друга. На сервеную часть придут значения только последних элементов, которые перезатрут остальные. Что делать? Простейший способ - в названия элементов засовывать айди, т.е. будет title_1, title_2 и т.д... Но при этом возникают сложности обработки массива $_POST, т.к. надо перебирать все его элементы, выяснять что это за поле, к какому айди он принадлежит и т.д... Единственный нормальный выход - пользоваться массивами в именах. О данном методе редко вспоминают, но знать о нём иногда бывает полезно HTML: <form method="post" action="save.php"> <table> <tr><th>TITLE</th><th>CONTENT</th></tr> <tr> <td> <input type="hidden" name="elem[1][id]" value="1"> <input type="text" name="elem[1][title]" value="First title"> </td> <td> <textarea name="elem[1][content]">Content of first element</textarea> </td> </tr> <tr> <td> <input type="hidden" name="elem[2][id]" value="2"> <input type="text" name="elem[2][title]" value="Second title"> </td> <td> <textarea name="elem[2][content]">Content of second element</textarea> </td> </tr> </table> <input type="submit" value="save"> </form> При этом на серверной части мы получаем массив отсортированных элементов $_POST['elem']. В отличие от редактирования одной формы, при сохранении таблицы в базе нужно будет перезаписывать ВСЕ поля для ВСЕХ элементов, т.к. неизвестно какие поля были изменены пользователем, а какие - нет. При использовании чистого пхп код на стороне сервера возрастает в разы, возрастает также нагрузка на сессию или куки, что требует дополнительных данных. Теперь рассмотрим добавление нового элемента: Необходимо при нажатии на кнопку "Добавить элемент" отправить всю форму на сервер, на сервере её НЕ СОХРАНЯТЬ в базу, а сохранить в сессию (т.к. если пользователь что-либо изменил в таблице, то нужно это сохранить где-то, но не в базе на случай, если пользователь не захочет сохранять свои изменения). При этом нужно также эти данные обратно пользователю вывести в той же таблице + ещё одна строчка для ввода пустых значений, айди у этой строчки будет 0. Т.е. будет примерно так: HTML: <form method="post" action="save.php"> <table> <tr><th>TITLE</th><th>CONTENT</th></tr> <tr> <td> <input type="hidden" name="elem[1][id]" value="1"> <input type="text" name="elem[1][title]" value="First title"> </td> <td> <textarea name="elem[1][content]">Content of first element</textarea> </td> </tr> <tr> <td> <input type="hidden" name="elem[2][id]" value="2"> <input type="text" name="elem[2][title]" value="Second title"> </td> <td> <textarea name="elem[2][content]">Content of second element</textarea> </td> </tr> <tr> <td> <input type="hidden" name="elem[3][id]" value="0"> <input type="text" name="elem[3][title]" value=""> </td> <td> <textarea name="elem[3][content]"></textarea> </td> </tr> </table> <input type="submit" value="save"> </form> При сохранении данной формы нужно перебирать все элементы с айди = 0 и добавлять их в базу. При данном подходе с помощью "массива" в посте, данная операция выполняется легко, чего нельзя сказать о том, если бы мы использовали предыдущие способы именования элементов. Я не буду расписывать все сложности, с которыми придётся столкнуться, но их будет много. То, что я описал, это лишь логическое начало. Я не описал удаление элементов, добавление сразу нескольких элементов, удаление/добавление столбцов (это вообще отдельный разговор) и много чего ещё. Повторюсь ещё раз: без использования динамических форм на клиенте (то бишь javascript) нагрузка на серверную часть возрастает в разы, а перезагружаться при каждом изменении - это то, что будет бесить пользователя.
Gromo, вот ты постарался. Я было начал писать ответ, да бросил это дело. Действительно, человек без опыта работы с БД и без знаний JS (и JQuery) просто не справится. Тем более, если нужно добавлять столбцы...