2013-08-14 2 views
1

Я хочу создать шаблон с Enlive Clojure для «таблицы», такой как html-страница, которая должна иметь заголовок и строки. Я хочу заполнить эту «таблицу» данными, которые поступают с этой карты. Basicaly Я хочу заполнить заголовок клавишами и ячейками с vals с каждой из карт, которые поступают из ключа событий-данных.В clojure оживить, как создать шаблон для добавления значений и ключей с карты

(def dummy-content 
{:title "Events Mashup" 
:event-data [{ :event-name "event name 1" 
        :performer "performer 1" 
        :date "date 1" 
         :start-time "start time 1" 
         :end-time "end time 1"} 
    {:event-name "event name 2" 
         :performer "performer 2" 
         :date "date 2" 
         :start-time "start time 2" 
         :end-time "end time 2"}]}) 

Мои фрагменты кода и шаблон выглядеть следующим образом:

(defsnippet header-cell "index.html" [:.psdg-top-cell] [value] [:.psdg-top-cell] 

(defsnippet value-cell "index.html" [:.psdg-right] [value] [:.psdg-right] 

(deftemplate mshp "index.html" [content] 
[:.psdg-top] (append (for [c (keys content)] (header-cell c))) 
[:.psdg-right] (append (for [v (vals content)] (value-cell v)))) 

И index.html есть эти теги, которые rellevant для этого шаблона.

<div id="psdg-top"> 
<div class="psdg-top-cell" style="width:129px; text-align:left; padding- left:24px;">Summary</div> 
<div class="psdg-top-cell">Website.com</div> 
</div> 
<div class="psdg-right">10 000</div> 

Когда я называю шаблон я получаю эту ошибку:

=> (mshp (:event-data dummy-content)) 

ClassCastException clojure.lang.PersistentHashMap не может быть приведен к java.util.Map $ Входа clojure.lang.APersistentMap $ ValSeq.first (APersistentMap.java:183) Что я делаю неправильно?

ответ

1

Ошибка возникает, когда вы вызываете (keys content), потому что (:event-data dummy-content) возвращает вектор, а keys не будет работать над вектором. У вас есть два варианта: вы можете либо определить свои столбцы заголовков в другом месте, либо просто взять их из первого элемента в векторе, например: (keys (first content)).

Редактировать

Я был пойти на тиражирование, что вы отправитесь в вопросе, но исправления ошибок, и вы можете найти мои усилия здесь: https://www.refheap.com/17659.

Если вы хотите что-то, что имеет более типичную структуру таблицы, с ячейками значений, содержащимися в строках, вы можете попробовать следующее. Он использует clone-for вместо комбинации append и for, и использует nth-of-type просто возвращает первую «PSDG-топ-клетку» (в противном случае было бы в два раза больше)

(def template 
    (html-snippet 
    "<div id=\"psdg-top\"> 
    <div class=\"psdg-top-cell\">Summary</div> 
    <div class=\"psdg-top-cell\">Website.com</div> 
    </div> 
    <div class=\"psdg-right\">10 000</div>")) 

(defsnippet header-row template [[:.psdg-top-cell (nth-of-type 1)] ] [headers] 
    (clone-for [h headers] 
    (content h))) 

(defsnippet value-row template [:.psdg-right] [values] 
    (clone-for [v values] 
    (content v))) 

(deftemplate mshp template [events] 
    [:#psdg-top] (content (header-row (map name (keys (first events))))) 
    [:.psdg-right] (clone-for [e events] 
         (do-> 
         (wrap :div {:class "psdg-row"}) 
         (content (value-row (vals e)))))) 
+0

он работает сейчас, когда я звоню он вроде этого (print (apply str (mshp (: event-data dummy-content)))), кажется, хорошо, за исключением того, что сначала дает мне только первую карту ... – Vesna

+0

спасибо, что показал мне функцию имени. ll se now, что делать дальше ... – Vesna

+0

Не знаю, почему это работает => (html/sniptest "

Website.com
" [: .psdg-top-cell] (html/content (name (first (keys (first (: фиктивное содержимое событийных данных))))))) "
end-time
"и defsnippet ничего не меняет? – Vesna