2012-05-26 2 views
1

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

Это как моя страница выглядит следующим образом:

(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, если нет (check = 100 или 010, 011, если было выбрано два флажка). В текстовом поле tfield = userinputtext.

EDIT Я провел много времени в качестве разработчика .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)) 

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

Может ли кто-нибудь мне помочь?

+0

Может быть полезно, если вы предоставите несколько примеров вызовов 'create-url' с параметрами и ожидаемыми возвращаемыми значениями. – ivant

+0

Привет ivat, спасибо, что ответили. К сожалению, я не знаю, как анализировать значения из html-страницы в clojure. Я могу только предоставить псевдо-код, который мог бы объяснить, чего бы хотелось достичь. –

+0

ivat, я предоставил псевдокод для моей функции. Но проблема в том, что я не знаю, как работать с путями, и я действительно не знаю, как предоставить правильные параметры для моей функции. Как вы думаете, вы можете мне помочь? –

ответ

1

Во-первых, вам нужно добавить атрибуты «name» к вашим входным элементам 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)))) 

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

  • Нет связанных вопросов^_^