Clojure (Икота): Как узнать, какая кнопка отправки была нажата в форме?

У меня есть форма, использующая структуру икоты. Это выглядит так:

(form-to {:enctype "multipart/form-data"}
  [:post "/add-data"]

  ...

  (submit-button {:class "btn"} "Save")
  (submit-button {:class "btn} "Clone"))

Как узнать, какая кнопка отправки была нажата, без использования jQuery/javascript?

Я просмотрел документацию Hiccup для request. Но у элемента request не так много документации.


person sakh1979    schedule 11.01.2015    source источник


Ответы (2)


Полный пример выглядит так:

(ns myapp.routes.home
  (:use [hiccup core form])
  (:require [compojure.core :refer :all]))

(defn quick-form [& [name message error]]   
  (html
   (form-to {:enctype "multipart/form-data"}
    [:post "/form-out"]
   (text-field "Hello")
   (submit-button {:class "btn" :name "submit"} "Save")
   (submit-button {:class "btn" :name "submit"} "Clone"))))

Обратите внимание, что использование одного и того же имени для обеих кнопок отправки позволяет выполнять простой поиск ключа «отправить» на карте результатов.

(defroutes home-routes
 (GET "/form-in" [] (quick-form))
 (POST "/form-out" [:as request] (str (request :multipart-params))))

При открытии следующей страницы:

 http://localhost:3000/form-in

И заполнив форму, результат маршрута POST:

 {"submit" "Save", "Hello" "hello2"}

Кстати, я нашел старый полезный пост о том, как карта запроса структурирована в Compojure, поэтому ее легче деструктурировать в коде Clojure.

person Nicolas Modrzyk    schedule 13.01.2015
comment
Спасибо! Это то, что я искал. - person sakh1979; 13.01.2015

submit-button создать HTML-элемент <input type="text" ...>. Вы можете добавить к ним атрибуты «имя» и «значение»:

(submit-button {:name "button" :value "save" :class "btn"} "Save")
(submit-button {:name "button" :value "clone" :class "btn"} "Clone")

и найдите это в своем коде на стороне сервера. В вашем случае используется lib-noir. Но последняя версия lib-noir больше не предоставляет утилиты для деструктуризации запросов и побуждает людей использовать другие библиотеки, такие как Compojure или голый Ring.

В основном вам нужно: - убедитесь, что ваше приложение на стороне сервера использует промежуточное ПО wrap-params Ring - в случае нажатия вышеуказанной кнопки «Сохранить», ваш обработчик на стороне сервера для [:post "/add-data"] должен получить хэш-карту, подобную этой:

{:http-method :post
 :uri "/add-data"
 :form-params {"button" "save"
               ;; other form data as key/value pairs
               ;; where: key is input element's "name" attribute and value is input element's "value" attribute
               ...
               }
 ...}

Надеюсь, вы сами разберетесь, как найти нужное вам значение в такой карте.

Более подробное чтение:

https://github.com/mmcgrana/ring/wiki/Parameters

person myguidingstar    schedule 12.01.2015
comment
Но как мне узнать, какая кнопка была нажата со стороны сервера? Я использую lib-noir, но не могу понять, как использовать его запрос для получения информации. - person sakh1979; 12.01.2015
comment
код на стороне сервера различается для библиотек/фреймворков, поэтому в вашем вопросе лучше упомянуть lib-noir - person myguidingstar; 13.01.2015