За последние 24 часа нас посетили 55502 программиста и 1710 роботов. Сейчас ищут 884 программиста ...

Динамическое изменение таблицы через форму и ее заполнение

Тема в разделе "PHP для новичков", создана пользователем Pris, 30 апр 2011.

  1. Pris

    Pris Активный пользователь

    С нами с:
    24 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте! Существует таблица которая выводится из базы данных в php скрипт, как сделать так что бы в ней можно было по желанию добавлять новые столбцы или прятать уже существующие? Заранее спасибо!
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Pris
    в большинстве случаев это делается на javascript. даже простейшая реализация лёгкой не будет, т.к. по большей части веб предназначен для работы только с одной формой за раз, а не с таблицей.

    Большего количества кода потребуется и на серверной стороне для того, чтобы учесть особенности редактирования таблиц.
     
  3. Pris

    Pris Активный пользователь

    С нами с:
    24 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    А в меньшенстве случаев это можно реализовать на php? Я ведь и php то плохо знаю, а о программировании на javascript и мечтать не могу.
     
  4. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    можно. но при любом изменении страница будет перегружаться
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    PHP будет задействован в любом случае, т.к. это серверная часть, отдающая контент.
    В зависимости от требований задача будет находится в диапазоне от средне-тяжёлой до невероятно сложной с кучей ограничений. С учётом
    и
    задача кажется невыполнимой.

    Давай рассмотрим редактирование таблицы из двух элементов, каждый из которых содержит поля id, title, content:

    HTML:
    1. <form method="post" action="save.php">
    2.   <table>
    3.     <tr><th>TITLE</th><th>CONTENT</th></tr>
    4.     <tr>
    5.       <td>
    6.         <input type="hidden" name="id" value="1">
    7.         <input type="text" name="title" value="First title">
    8.       </td>
    9.       <td>
    10.         <textarea name="content">Content of first element</textarea>
    11.       </td>
    12.     </tr>
    13.     <tr>
    14.       <td>
    15.         <input type="hidden" name="id" value="2">
    16.         <input type="text" name="title" value="Second title">
    17.       </td>
    18.       <td>
    19.         <textarea name="content">Content of second element</textarea>
    20.       </td>
    21.     </tr>
    22.   </table>
    23.   <input type="submit" value="save">
    24. </form>
    и первая ожидающая засада - названия элементов. У нас несколько элементов с названием title, content, id, который будут перезаписывать друг друга. На сервеную часть придут значения только последних элементов, которые перезатрут остальные. Что делать? Простейший способ - в названия элементов засовывать айди, т.е. будет title_1, title_2 и т.д... Но при этом возникают сложности обработки массива $_POST, т.к. надо перебирать все его элементы, выяснять что это за поле, к какому айди он принадлежит и т.д...

    Единственный нормальный выход - пользоваться массивами в именах. О данном методе редко вспоминают, но знать о нём иногда бывает полезно

    HTML:
    1. <form method="post" action="save.php">
    2.   <table>
    3.     <tr><th>TITLE</th><th>CONTENT</th></tr>
    4.     <tr>
    5.       <td>
    6.         <input type="hidden" name="elem[1][id]" value="1">
    7.         <input type="text" name="elem[1][title]" value="First title">
    8.       </td>
    9.       <td>
    10.         <textarea name="elem[1][content]">Content of first element</textarea>
    11.       </td>
    12.     </tr>
    13.     <tr>
    14.       <td>
    15.         <input type="hidden" name="elem[2][id]" value="2">
    16.         <input type="text" name="elem[2][title]" value="Second title">
    17.       </td>
    18.       <td>
    19.         <textarea name="elem[2][content]">Content of second element</textarea>
    20.       </td>
    21.     </tr>
    22.   </table>
    23.   <input type="submit" value="save">
    24. </form>
    При этом на серверной части мы получаем массив отсортированных элементов $_POST['elem'].

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

    Теперь рассмотрим добавление нового элемента:
    Необходимо при нажатии на кнопку "Добавить элемент" отправить всю форму на сервер,
    на сервере её НЕ СОХРАНЯТЬ в базу, а сохранить в сессию (т.к. если пользователь что-либо изменил в таблице, то нужно это сохранить где-то, но не в базе на случай, если пользователь не захочет сохранять свои изменения). При этом нужно также эти данные обратно пользователю вывести в той же таблице + ещё одна строчка для ввода пустых значений, айди у этой строчки будет 0. Т.е. будет примерно так:

    HTML:
    1. <form method="post" action="save.php">
    2.   <table>
    3.     <tr><th>TITLE</th><th>CONTENT</th></tr>
    4.     <tr>
    5.       <td>
    6.         <input type="hidden" name="elem[1][id]" value="1">
    7.         <input type="text" name="elem[1][title]" value="First title">
    8.       </td>
    9.       <td>
    10.         <textarea name="elem[1][content]">Content of first element</textarea>
    11.       </td>
    12.     </tr>
    13.     <tr>
    14.       <td>
    15.         <input type="hidden" name="elem[2][id]" value="2">
    16.         <input type="text" name="elem[2][title]" value="Second title">
    17.       </td>
    18.       <td>
    19.         <textarea name="elem[2][content]">Content of second element</textarea>
    20.       </td>
    21.     </tr>
    22.     <tr>
    23.       <td>
    24.         <input type="hidden" name="elem[3][id]" value="0">
    25.         <input type="text" name="elem[3][title]" value="">
    26.       </td>
    27.       <td>
    28.         <textarea name="elem[3][content]"></textarea>
    29.       </td>
    30.     </tr>
    31.   </table>
    32.   <input type="submit" value="save">
    33. </form>
    При сохранении данной формы нужно перебирать все элементы с айди = 0 и добавлять их в базу. При данном подходе с помощью "массива" в посте, данная операция выполняется легко, чего нельзя сказать о том, если бы мы использовали предыдущие способы именования элементов.

    Я не буду расписывать все сложности, с которыми придётся столкнуться, но их будет много. То, что я описал, это лишь логическое начало. Я не описал удаление элементов, добавление сразу нескольких элементов, удаление/добавление столбцов (это вообще отдельный разговор) и много чего ещё.

    Повторюсь ещё раз: без использования динамических форм на клиенте (то бишь javascript) нагрузка на серверную часть возрастает в разы, а перезагружаться при каждом изменении - это то, что будет бесить пользователя.
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Gromo, вот ты постарался. Я было начал писать ответ, да бросил это дело. Действительно, человек без опыта работы с БД и без знаний JS (и JQuery) просто не справится. Тем более, если нужно добавлять столбцы...