2015-10-25 7 views
1

Я пытаюсь просмотреть список продуктов в дереве, каждый товар имеет категорию. Я хотел бы разбить вывод на группы в категории со списком продуктов под заголовком каждой категории. Есть ли способ сделать это в деревушке, пробираясь через мои продукты. То, что я сейчас имею ниже, показывает заголовок для каждого продукта. Я думаю, что, возможно, все это не так.Целевая панель Yesod разбита по категориям

$if null products 
    <p>No products 
$else 
    <div class="list-group menu"> 
    $forall product <- products 
     <div class="list-group-item"> 
     <h4 class="list-group-item-heading">#{categoryName $snd product} 

     <div class="list-group-item"> 
     <div class="container-fluid"> 
      <div class="col-md-12"> 
      <p>#{productName $fst product} - #{productPrice $fst product} 

И ниже является немного кода Thats получает продукцию из базы данных типа [(Product Category)]

products <- runDB $ selectList [ProductName !=. ""] [LimitTo 10] >>= mapM (\[email protected](Entity _ q) -> do 
    Just category <- get $ productCategory q 
    return (q, category)) 

ответ

4

Я думаю, что ответ должен иметь свой Йесод групповой контроллер продукты в категории для вас.

Например, вместо экспорта:

products :: [Product] 

экспорт:

productGroups :: [ (Category, [Product]) ] 

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

$if null productGroups 
    <p>No products. 
$else 
    <div ...> 
    $forall (category, products) <- productGroups 
     <h4>#{category}</h4> 
     $forall product <- products 
     <div>...render the product...</div> 

Таким образом, продукты появляются в группах по к их категории.

Для создания группы продуктов вы можете использовать что-то вроде:

import GHC.Exts (groupWith) 

groupByCategory :: [Product] -> [ (Category, [Product]) ] 
groupByCategory ps = [ (getCategory (head g), g) | g <- groupWith getCategory ] 
    where getCategory product = categoryName (snd product) 

Предостережения: Это проверялось, непроверенный код.

Update

В ответ на ваш вопрос ИНТ комментарии, здесь можно группировать список пар по второй координате:

import Data.Ord (comparing) 
import Data.List (sortBy, groupBy) 

groupBySecond :: Ord b => [ (a,b) ] -> [ (b, [a]) ] 
groupBySecond pairs = 
    let sorted = sortBy (comparing snd) pairs 
     groups = groupBy (\(a1,b1) (a2,b2) -> b1 == b2) sorted 
     result = [ (snd (head g), map fst g) | g <- groups ] 
    in result 
+0

Hi. Мой текущий список продуктов поступает из базы данных, используя код, который я добавил к моему вопросу. Как преобразовать [(Продукт, Категория)] в [(Категория, [Продукт])] –

+0

Ответа на этот вопрос. – ErikR