2012-06-08 2 views
2

Я создаю приложение Lift, где одна из страниц основана на примере «Загрузка файлов» из демонстрации Lift: http://demo.liftweb.net/file_upload.Как изменить действие формы в Поднимите

Если вы посмотрите на source code for that page ... Вы видите, что есть лифт «фрагмент» тег, окружая два «выбрать» теги:

<lift:snippet type="misc:upload" form="post" multipart="true"> 

<choose:post> 
<p> 
File name: <ul:file_name></ul:file_name><br > 
MIME Type: <ul:mime_type></ul:mime_type><br > 
File length: <ul:length></ul:length><br > 
MD5 Hash: <ul:md5></ul:md5><br > 
</p> 
</choose:post> 

<choose:get> 
Select a file to upload: <ul:file_upload></ul:file_upload><br > 
<input type="submit" value="Upload File"> 
</choose:get> 

</lift:snippet> 

Идея заключается в том, что когда пользователь попадает на страницу для в первый раз (т. е. запрос GET), тогда Lift отобразит форму для загрузки файла. Когда пользователь отправляет форму (т. Е. Запрос POST на ту же страницу), тогда Lift вместо этого отображает результат обрабатываемого файла.

С моим приложением новая морщина заключается в том, что мой «результат» POST-вида должен быть также содержит форму. Я хочу, чтобы обеспечить ввод текста для пользователя, чтобы ввести адрес электронной почты, и кнопки отправки, что при нажатии будет по электронной почте информации о обработанном файле:

... 
<choose:post> 
<p> 
File name: <ul:file_name></ul:file_name><br > 
MIME Type: <ul:mime_type></ul:mime_type><br > 
File length: <ul:length></ul:length><br > 
MD5 Hash: <ul:md5></ul:md5><br > 
</p> 

<!-- BEGIN NEW STUFF --> 
Output: <br/> 
<textarea rows="30" cols="100"><ul:output></ul:output></textarea> 
<br/><br/> 
Email the above output to this email address:<br/> 
<ul:email/><br/> 
<input type="submit" value="Email"/> 
<!-- END NEW STUFF --> 

</choose:post> 
... 

Однако, как GET и версия POST этой страницы обернутый той же формой, созданной с помощью Lift, которая имеет «действие», установленное в том же фрагменте в обоих случаях. Как я могу изменить это так, что в версии POST действие формы изменяется на другой фрагмент?

В типичной веб-среде я бы подошел к чему-то подобному с событием «onclick» и двумя основными строками JavaScript. Тем не менее, я даже не начал обдумывать вокруг Lift's ... err, интересные представления о написании JavaScript в Scala. Возможно, мне нужно спуститься по этому маршруту, или, может быть, есть лучший подход.

ответ

1

Я согласен с Брайаном, использую новый крепежный CSS-интерфейс Lift's.

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

Я также предпочитаю новый атрибут HTML-данных.

Файл загрузки HTML:

<div data-lift="uploadSnippet?form=post"> 
    <input type="file" id="filename" /> 
    <input type="submit" id="submit" /> 
</div 

загрузки файла фрагмент кода:

class uploadSnippet { 
    def processUpload = { 
     // do your processing 
     .... 
     if (success) 
      S.seeOther("/getemail") 

     // if processing fails, just allow this method to exit to re-render your 
     // file upload form 
    } 

    def render = { 
     "#filename" #> SHtml.fileUpload(...) & 
     "#submit" #> SHtml.submit("Upload", processUpload _) 
    } 
} 

GetEmail HTML:

<div data-lift="getEmailSnippet?form=post"> 
    <input type="text" id="email" /> 
    <input type="submit" id="submit" /> 
</div 

Get Email Отрывок:

class getEmailSnippet { 
    def processSubmit = { 
     .... 
    } 

    def render = { 
     "#email" #> SHtml.text(...) & 
     "#submit" #> SHtml.submit("Upload", processSubmit _) 
    } 

Там немного больше обработки формы в моем блоге на использовании RequestVar в здесь: http://tech.damianhelme.com/understanding-lifts-requestvars

Позвольте мне знать, если вы хотите более подробно.

Надеется, что это полезно

Приветствие

Damian

0

Если кто-то придумает более элегантный (или «Lift-y») подход в течение ближайших нескольких дней, я приму их ответ. Тем не менее, я придумал подход обходного пути самостоятельно.

Я сохранил текущий макет, где в представлении есть блок GET и блок POST, которые отправляются в одну и ту же функцию фрагмента. Функция snippet по-прежнему имеет блок if-else, обрабатывая каждый запрос по-разному в зависимости от того, является ли это GET или POST.

Однако у меня также есть вторичный блок if-elseвнутри блока POST. В этом внутреннем if-else отображается имя кнопки отправки, на которую была нажата кнопка. Если кнопка отправки была выбрана для загрузки файла, тогда фрагмент обрабатывает загрузку и обработку файла. В противном случае, если это была кнопка отправки отправки электронной почты, отображаемая после первого POST, тогда фрагмент обрабатывает отправку электронной почты.

Не особенно гламурный, но он отлично работает.

2

Во-первых, я предлагаю вам использовать новую удобную привязку CSS для Lift, а не пользовательский тег XHTML.

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

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

<choose:post> 
<p> 
File name: <ul:file_name></ul:file_name><br > 
MIME Type: <ul:mime_type></ul:mime_type><br > 
File length: <ul:length></ul:length><br > 
MD5 Hash: <ul:md5></ul:md5><br > 
</p> 
<!-- 
    The following is same as <lift:snippet type="EMailForm" form="post" multipart="true"> 
--> 
<form action="" method="post" data-lift="EMailForm"> 
    <input type="text" name="email"/> 
    <input type="submit" /> 
</form> 
</choose:post> 

Затем обработайте действие формы электронной почты в классе snippet EMailForm.

Наконец, вы можете передать имя файла/minetype и другую информацию, используя скрытый элемент формы или SessionVar.

Смежные вопросы