Разбор значений из нескольких флажков с помощью compojure

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

Вот так выглядит моя страница:

(defn view-layout [& content]
  (html [:body content]))

(defn view-input []
    (view-layout
     [:h2 "Find"]
     [:form {:method "post" :action "/"}
     ( for [category ["Cat1" "Cat2" "Cat3"]]
      [:input {:type "checkbox" :id category } category ] )       
      [:br]
     [:input {:type "text" :id "a" :value "insert manga name"}] [:br]
     [:input.action {:type "submit" :value "Find"}]
     [:a {:href "/downloads"} "Downloads"]]))

(defn view-output []
  (view-layout
    [:h2 "default images"]
    [:form {:method "post" :action "/"}         
      (for [name (get-content-from-url (create-url))]        
        [:label name [:br]]            
           )]))

(defn create-manga-url
  []
  "http://www.mysite.net/search/?tfield=&check=000")

Вот маршруты:

(defroutes main-routes            
   (GET "/" []
      (view-input))
  (GET "/downloads" []
      (view-downloads))
  (POST "/" []
       (view-output) ))

На данный момент мне нужна помощь с функцией (create-url) (возвращает строку), где я хотел бы получить все поля, обязательные для моего поиска (одно текстовое поле и 3 флажка), и проанализировать их значения, которые будут переданы в ( конкатенированный) URL-адрес - для флажка, если флажок установлен, раздел флажка будет иметь значение 1 вместо 0 или останется 0, если нет (флажок = 100 или 010, 011, если были выбраны два флажка). В случае текстового поля tfield=userinputtext.

РЕДАКТИРОВАТЬ Я провел много времени в качестве разработчика .Net и Java, и эта часть compojure для меня полная загадка. Это то, чего я хотел бы добиться с помощью функции (create-url) (псевдокод, написанный в стиле OO):

 (defn create-url [*text_field cbox1 cbox2 cbox3*]
(def url "http://www.mysite.net/search/?")
(def tfield "tfield=")
(def cbox "&check=")

(if (checked? cbox1)
(str cbox "1")
(str cbox "0"))

(if (checked? cbox2)
(str cbox "1")
(str cbox "0"))

(if (checked? cbox3)
(str cbox "1")
(str cbox "0"))

(str tfield (:value text_field))

(str url tbox cbox))

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

Кто-нибудь может мне с этим помочь?


person Мitke    schedule 26.05.2012    source источник
comment
Было бы полезно, если бы вы предоставили несколько примеров вызовов create-url с параметрами и ожидаемыми возвращаемыми значениями.   -  person ivant    schedule 27.05.2012
comment
Привет ват, спасибо за ответ. К сожалению, я не знаю, как парсить значения с html страницы в clojure. Я могу только предоставить псевдокод, который мог бы объяснить, чего хотелось бы добиться.   -  person Мitke    schedule 27.05.2012
comment
ivat, я предоставил псевдокод для своей функции. Но проблема в том, что я не умею работать с путями, и я действительно не знаю, как предоставить правильные параметры для моей функции. Как вы думаете, вы можете помочь мне с этим?   -  person Мitke    schedule 27.05.2012
comment
Возможно, документация compojure может помочь? Нравится эта страница: github.com/weavejester/compojure/wiki/Destructuring-Syntax   -  person ivant    schedule 27.05.2012


Ответы (1)


Во-первых, вам нужно добавить атрибуты «имя» к вашим элементам ввода HTML. Атрибуты «id» не отправляются на сервер при отправке.

Далее, я думаю, быстрый способ сделать это похоже на ваш пример:

(POST "/" [a Cat1 Cat2 Cat3] (create-url a [Cat1 Cat2 Cat3]))

а потом что-то вроде этого:

(defn checked? [c]
  (and c (= c "on")))

(defn checked->num [c]
  (if (checked? c) "1" "0"))

(defn create-url [a cats]
  (str "x?tfield=" a "&check="
    (apply str (for [c cats] (checked->num c)))))

Или просто бросьте два помощника:

(defn create-url [a cats]
  (str "x?tfield=" a "&check="
     (apply str (map #(if (= "on" %) "1" "0") cats))))
person Terje Sten Bjerkseth    schedule 05.04.2013