Multiplex ticket PUT and DELETE over POST

HTML forms support only GET and POST methods. One way to bypass that is
to send the form using JS. But I don't want that. Another is to send a
POST with a hidden form field which specifies the read method. This is
what 'postTicketR' does.
This commit is contained in:
fr33domlover 2016-05-02 11:34:11 +00:00
parent 9f917a7306
commit e8befc41ee
4 changed files with 15 additions and 4 deletions

View file

@ -55,7 +55,7 @@
/u/#Text/p/#Text/t TicketsR GET POST /u/#Text/p/#Text/t TicketsR GET POST
/u/#Text/p/#Text/t/!new TicketNewR GET /u/#Text/p/#Text/t/!new TicketNewR GET
/u/#Text/p/#Text/t/#Int TicketR GET PUT DELETE /u/#Text/p/#Text/t/#Int TicketR GET PUT DELETE POST
/u/#Text/p/#Text/t/#Int/edit TicketEditR GET /u/#Text/p/#Text/t/#Int/edit TicketEditR GET
-- /u/#Text/p/#Text/w WikiR GET -- /u/#Text/p/#Text/w WikiR GET

View file

@ -20,6 +20,7 @@ module Vervis.Handler.Ticket
, getTicketR , getTicketR
, putTicketR , putTicketR
, deleteTicketR , deleteTicketR
, postTicketR
, getTicketEditR , getTicketEditR
) )
where where
@ -34,7 +35,7 @@ import Database.Persist
import Text.Blaze.Html (Html, toHtml) import Text.Blaze.Html (Html, toHtml)
import Yesod.Auth (requireAuthId) import Yesod.Auth (requireAuthId)
import Yesod.Core (defaultLayout) import Yesod.Core (defaultLayout)
import Yesod.Core.Handler (setMessage, redirect) import Yesod.Core.Handler (setMessage, redirect, lookupPostParam, notFound)
import Yesod.Core.Widget (setTitle) import Yesod.Core.Widget (setTitle)
import Yesod.Form.Functions (runFormPost) import Yesod.Form.Functions (runFormPost)
import Yesod.Form.Types (FormResult (..)) import Yesod.Form.Types (FormResult (..))
@ -146,6 +147,14 @@ deleteTicketR shar proj num =
--delete tickets? --delete tickets?
error "Not implemented" error "Not implemented"
postTicketR :: Text -> Text -> Int -> Handler Html
postTicketR shar proj num = do
mmethod <- lookupPostParam "_method"
case mmethod of
Just "PUT" -> putTicketR shar proj num
Just "DELETE" -> deleteTicketR shar proj num
_ -> notFound
getTicketEditR :: Text -> Text -> Int -> Handler Html getTicketEditR :: Text -> Text -> Int -> Handler Html
getTicketEditR shar proj num = do getTicketEditR shar proj num = do
Entity _tid ticket <- runDB $ do Entity _tid ticket <- runDB $ do

View file

@ -16,6 +16,7 @@ $# <http://creativecommons.org/publicdomain/zero/1.0/>.
Enter the details and click "Submit" to update the ticket. Enter the details and click "Submit" to update the ticket.
<form method=PUT action=@{TicketR shar proj num} enctype=#{enctype}> <form method=POST action=@{TicketR shar proj num} enctype=#{enctype}>
<input type=hidden name=_method value=PUT>
^{widget} ^{widget}
<input type=submit> <input type=submit>

View file

@ -17,7 +17,8 @@ $# <http://creativecommons.org/publicdomain/zero/1.0/>.
<p> <p>
<a href=@{TicketEditR shar proj num}>Edit this ticket <a href=@{TicketEditR shar proj num}>Edit this ticket
<p> <p>
<form method=DELETE action=@{TicketR shar proj num}> <form method=POST action=@{TicketR shar proj num}>
<input type=hidden name=_method value=DELETE>
<input type=submit value="Delete this ticket"> <input type=submit value="Delete this ticket">
<p> <p>