Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Форма внутри формы
 
 автор: nmahkamov   (07.03.2012 в 14:49)   письмо автору
 
 

Можно ли создать форму внутри формы? Обработчик обеих форм совсем разные.

  Ответить  
 
 автор: ЯСА   (07.03.2012 в 14:57)   письмо автору
 
   для: nmahkamov   (07.03.2012 в 14:49)
 

Назначение формы - передача информации от формы серверу
с последующим вызовом страницы, URL которой указан в атрибуте ACTION тега <FORM>.
И только для этого форму размещают на странице!

Форма внутри формы - полный бред.

Но не переживайте.
Вы не первый такой.
Здесь уже были желающие разместить ссылку внутри ссылки.

  Ответить  
 
 автор: nmahkamov   (07.03.2012 в 15:07)   письмо автору
 
   для: ЯСА   (07.03.2012 в 14:57)
 

Я тоже очень хорошо понимаю. Но можно ли как нибудь это обходить? Т.е. есть одна форма, для создание задачи, а другая для прикрепления фалов.

  Ответить  
 
 автор: Valick   (07.03.2012 в 15:13)   письмо автору
 
   для: nmahkamov   (07.03.2012 в 15:07)
 

зачем вкладывать форму одну в другую?
у каждой формы кнопка имеет свое название (тег name)
по нему и различаются формы на сервере
и каждая форма может иметь свой адрес отправки (тег action)
можно назначить совершенно разные обработчики

  Ответить  
 
 автор: nmahkamov   (07.03.2012 в 15:28)   письмо автору
 
   для: Valick   (07.03.2012 в 15:13)
 

т.е. при введении чего либо в поле первой формы, создается запись в БД(аякс), и выбирается id этой записи и присваивается в скрытое поле второй формы(дочернюю). И прикрепляется файл с помощью второй формы. Потом, после прикреплении файлов (их 10 шт), при нажатии кнопки сохранить (первой формы) задача сохраняется. Задачи хранятся в отдельной таблице, а файлы в отдельной.

  Ответить  
 
 автор: ЯСА   (07.03.2012 в 15:40)   письмо автору
 
   для: nmahkamov   (07.03.2012 в 15:28)
 

Постарайтесь понять - для использования технологии Ajax форма ВОВСЕ не нужна.
Совсем не нужна.
Абсолютно не нужна.

Смотрите пример - http://codecenter.awardspace.com/selects.html - Ajax там работает, а никакой формы нет вовсе.

  Ответить  
 
 автор: nmahkamov   (07.03.2012 в 17:18)   письмо автору
 
   для: ЯСА   (07.03.2012 в 15:40)
 

Да я понимаю, но первая форма имеет примерно 12 элементов, и из них только 1 работает аяксом. А другие работают в обычном режиме через ПОСТ. Вот в чем фишка.

  Ответить  
 
 автор: ЯСА   (07.03.2012 в 17:25)   письмо автору
 
   для: nmahkamov   (07.03.2012 в 17:18)
 

Ну и зачем вам такая фишка?

Что именно вы не можете отправить через Ajax GET-ом безо всякой формы?
Что именно вы не можете отправить через Ajax POST-ом безо всякой формы?

  Ответить  
 
 автор: nmahkamov   (15.03.2012 в 11:55)   письмо автору
 
   для: ЯСА   (07.03.2012 в 17:25)
 

Тааак....

Значить, у меня есть страница создания задачи:
В нем есть поля название задачи, описание задачи,...., ФайлЫ (с uploadify).

В БД есть таблица tasks (id, name, description): в нем хранятся все задачи.

И потом есть таблица files (id, id_task, file_name): тут хранятся файлы (id_task привязан к tasks.id).

Вот именно, во время создания новой задачи (еще не сохраняя задачу) нужно прикрепить файлы. Как привязать ЭТИ файлы к ЭТОЙ задаче.

Приму любые советы.

  Ответить  
 
 автор: task   (15.03.2012 в 12:41)   письмо автору
 
   для: nmahkamov   (15.03.2012 в 11:55)
 

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

  Ответить  
 
 автор: ЯСА   (15.03.2012 в 13:12)   письмо автору
 
   для: nmahkamov   (15.03.2012 в 11:55)
 

Самый простой совет:

1. Сделайте на странице ДВЕ формы и ОДИН невидимый ифрейм.

2. Формы и ифрейм как-нить обзовите.
По-разному.
Например, так
<form name="first_form" target="invisible_iframe">
<form name="second_form">
<iframe name="invisible_iframe" style="display: none"></iframe>


3. Обработчики формам назначьте какие нужно.
Пусть первая форма (first_form) делает upload файлов и результат выводит в невидимом ифрейме.

4. Скриптовая связь между тремя этими объектами - примитивна:
первая форма -- document.first_form
вторая форма -- document.second_form
ифрейм - window.frames.invisible_iframe.document

5. Единственная проблема - определить момент, когда файлы из первой формы завершат upload
Решается введением обработчика onload в теге <IFRAME> следующего вида:
<iframe name="invisible_iframe[/b]" style="display: none" onload="if (!self.FLAG) {FLAG = 1; return} else YourFunction ()"></iframe>

6. А вот эта самая YourFunction (), используя объекты, перечисленные выше в п. 4, может взять любые данные из любых полей первой формы, любые полученные от сервера после upload'a файлов данные из ифрейма и "засунуть" их в нужные поля второй формы.
А там - решайте задачу...
И жмите второй сабмит по окончании решения.

  Ответить  
 
 автор: task   (15.03.2012 в 13:32)   письмо автору
 
   для: ЯСА   (15.03.2012 в 13:12)
 

А зачем для добавления нового (речь я так понял об этом) такие сложности, ведь все делается просто и одной формой, последовательно внося в базу принятые данные при ее приеме. Смысла получить описание задачи одной формой, ради того чтобы сформировать идентификатор, затем отдав его клиенту для другой формы ради привязки файлов нет никакого.
В случае же, если необходимо привязать к уже существующему идентификатору, то это уже не добавление, а редактирование, и опять таки не надо ни отдельных форм, ни фреймов.

  Ответить  
 
 автор: ЯСА   (15.03.2012 в 13:52)   письмо автору
 
   для: task   (15.03.2012 в 13:32)
 

1. Ну написал же человек - хочет он, находясь на одной и той же странице, сначала проаплодить файлы от пользователя.

2. Видимо, ему надо получить сообщение от сервера об успешном аплоаде в виде URL'ов этих посланных юзером файлов.

3. С технологией Ajax связываться он, как я понял, не желает - не знаю уж почему.

4. В предложенном мною варианте все его задачи (как я их понял) решаются самым простым способом.
Сообщение об аплоаде и/или URL'ы файлов могут быть возвращены обработчиком первой формы в ифрейм в любом виде - как просто текст, как value каких-то инпутов какой-то новой формы в ифрейме (третьей уже по счёту!)...
"Достать" эти данные для использования во второй форме - элементарно (скриптовые объекты я описал выше).

  Ответить  
 
 автор: task   (15.03.2012 в 14:22)   письмо автору
 
   для: ЯСА   (15.03.2012 в 13:52)
 

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

  Ответить  
 
 автор: nmahkamov   (19.03.2012 в 16:13)   письмо автору
 
   для: task   (15.03.2012 в 14:22)
 

Да, правильно, Сначала задача создается, потом этот див (див для формы загрузки файлов) показывается, и только потом может прикреплять файлы.

  Ответить  
 
 автор: task   (19.03.2012 в 16:42)   письмо автору
 
   для: nmahkamov   (19.03.2012 в 16:13)
 

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

  Ответить  
 
 автор: nmahkamov   (19.03.2012 в 17:39)   письмо автору
 
   для: task   (19.03.2012 в 16:42)
 

Тогда объясните, как сделать одной формой. Чтоб в одной страничке создать задачу и сразу прикрепить к нему файлы. Структуру БД оставим так, как я описал выше: задачи в отдельной и файлы в отдельной табличке.

  Ответить  
 
 автор: task   (19.03.2012 в 18:39)   письмо автору
 
   для: nmahkamov   (19.03.2012 в 17:39)
 

Забудьте, на время, об Ajax. Пусть у вас будет форма с тремя полями - одно текстовое, для описания задачи, и два поля для добавления файлов. Вывод этой формы, как и ее проверку, и добавление в базу ее данных, обрабатывает один и тот же скрипт (страница).
Сперва вы выводите форму, а если пришел запрос от формы (пришли данные), начинается их проверка.
Если пользователь добавил файлы, но забыл описать задачу, значит вы должны вернуть форму вновь, указав на ошибку - отсутствие описания задачи. Но при этом не надо заставлять пользователя загружать файлы вновь, их временно можно сохранить, в сессии. Как только пользователь добавит описание, заносите его в базу, и сразу же после этого запроса, если он успешен, функцией mysql_insert_id() получаете id этой добавленной задачи, перезаписываете файлы из сессии, заносите информацию о них в базу, добавляя полученный id родителя.
В случае, если форма пришла сразу в комплекте (наличие описания), то и сохранять временно ничего не надо.

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

  Ответить  
 
 автор: nmahkamov   (20.03.2012 в 10:28)   письмо автору
 
   для: task   (19.03.2012 в 18:39)
 

О файлах я написал выше: их может быть максимум 10 штук (uploadify, надеюсь Вы это знаете). В этом случае как поступить?

  Ответить  
 
 автор: task   (20.03.2012 в 10:55)   письмо автору
 
   для: nmahkamov   (20.03.2012 в 10:28)
 

А что десток файлов как то изменяет ситуацию?

Если описание задачи по объему равно роману "Война и мир", таки да, надо согласиться, что прием такого описания придется принимать частями, и тоже самое, если к вашему "роману" будет добрая сотня, две, иллюстраций.

Последовательный прием данных от пользователя оправдан тогда, когда данные велики по объему (имеется ввиду множество полей, как и возможно большой объем принимаемых данных, которые не сможет принять сервер за один сеанс), или их можно разбить на логически законченные блоки. У вас же поле описания, пусть еще и заголовок, и десяток прикрепленных файлов, неужто это нельзя отправить сразу?

Поля добавления файлов изначально можно сделать скрытыми, показывая их только в том случае, если заполнено описание, либо добавлять их динамически в форму, столько, сколько требуется. Форму можно не отправлять до тех пор, пока не заполнены поля родители - описание.

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

  Ответить  
 
 автор: nmahkamov   (20.03.2012 в 11:07)   письмо автору
 
   для: task   (20.03.2012 в 10:55)
 

не, я имел ввиду загрузку этих файлов, и внесения в БД. Т.е. если человек загрузил файлы и не заполнил другие поля, то как вы уже сказали: скрипт вернет форму задачи ( а файлы заново грузит нет необходимости ). Вот именно в этот момент как нужно поступить с загруженными файлами? Они где должны находится? Во временной директории или нужно их переместить в "мою" папку и занести инфу в БД и ждать форму задачи .... Как-то по-подробнее этот шаг, плиз.

  Ответить  
 
 автор: task   (20.03.2012 в 11:22)   письмо автору
 
   для: nmahkamov   (20.03.2012 в 11:07)
 

Вернет ли скрипт форму или нет, это не скрипту решать, а вам. Вы должны описать в скрипте все "если", и как обслуживать эти "если".

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

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

Внести содержимое файла в сессию можно функцией file_get_contents(). Переписать из сессии в папку функцией copy(). Если файлов несколько, то удобно держать их в сессии в виде массива.

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

  Ответить  
 
 автор: nmahkamov   (19.03.2012 в 17:05)   письмо автору
 
   для: ЯСА   (15.03.2012 в 13:52)
 

Можно по подробнее о методе с Аякс технологией. Я знаю эту технологию, и готов выслушать Ваш совет.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования