Skip to content

Category Module

  • Domain Layer: Provides domain model for:

    • (product)category with potential data a category can have (like name, media, ...)
    • a (category) tree
    • the related categoryService interface (= Secondary Port)
  • Interface Layer:

    • Provides controller for rendering category pages, supporting different templates based on the category type.
    • Provides data controller to access category and tree from inside templates
  • Product Search:

    • Since it's expected that products should be shown, there is a dependency to the "product" module - more specific to the productSearchService.
    • The category module defines in its domain also a "CategoryFilter" (that implements the search filter interface): This filter is passed to the productSearchService, so any implementation of the product search service should understand this special filter.

Configurations

You can set the templates for the category single view (if it should be different from default)

# default template
commerce.category.view.template: "category/category"

# template used for category type "teaser"
commerce.category.view.teaserTemplate: "category/teaser"

Usage in templates

This module provides two data controller that can be used to get category and tree objects:

- var rootCategoryTree = data('category.tree', {'code': ''})

 each category in rootCategoryTree.categories

- var category = data("category",{'code': 'category-code'})

Dependencies:

  • product package: (for product searchservice)
  • search package: (for pagination)

GraphQL

This module offers GraphQL Shema and Resolver to get Categories.

Example:

query category {
  Commerce_Category(categoryCode:"flat-screen_tvs") {
        category {
        code
        attributes {
          all {code}
          metaKeywords:get(code:"meta_keywords") {values{value}}
          hasMetaKeywords: has(code:"meta_keywords")
        }
      }
    productSearchResult {
      products {
        baseData {title}
      }
    }
  }
}

Category tree from config

The module comes also with a Adapter for the secondary port "CategoryService" which can be activated by setting commerce.category.useCategoryFixedAdapter: true You can then configure a category tree like in the example below.

(Of course this is only useful for small tests or demos)

commerce:
  category:
    useCategoryFixedAdapter: true
    categoryServiceFixed:
      tree:
        electronics:
          code: electronics
          name: Electronics
          sort: 1
          childs:
            flat-screen_tvs:
              code: flat-screen_tvs
              name: Flat Screens & TV
            headphones:
              code: headphones
              name: Headphones
              childs:
                headphone_accessories:
                  code: headphone_accessories
                  name: Accessories
            tablets:
              code: tablets
              name: Tablets
        clothing:
          code: clothing
          name: Clothes & Fashion
          sort: 2

Categories and category tree from json files

The module comes with another Adapter for the "CategoryService" which can be activated by setting commerce.category.fakeService.enabled: true Per default the category tree and the extended data for the electronics category you can see below will be returned.

Default categoryTree.json:

[
  {
    "CategoryCode":       "electronics",
    "CategoryName":       "Electronics",
    "CategoryPath":       "Electronics",
    "SubTreesData": [
      {
        "CategoryCode":       "flat-screen_tvs",
        "CategoryName":       "Flat Screens & TV",
        "CategoryPath":       "Electronics/Flat Screens & TV"
      },
      {
        "CategoryCode":       "headphones",
        "CategoryName":       "Headphones",
        "CategoryPath":       "Electronics/Headphones",
        "SubTreesData": [
          {
            "CategoryCode":       "headphone_accessories",
            "CategoryName":       "Accessories",
            "CategoryPath":       "Electronics/Headphones/Accessories"
          }
        ]
      },
      {
        "CategoryCode":       "tablets",
        "CategoryName":       "Tablets",
        "CategoryPath":       "Electronics/Tablets"
      }
    ]
  },
  {
    "CategoryCode":       "clothing",
    "CategoryName":       "Clothes & Fashion",
    "CategoryPath":       "Clothes & Fashion",
    "SubTreesData": [
      {
        "CategoryCode":       "jumpsuits",
        "CategoryName":       "Jumpsuits",
        "CategoryPath":       "Clothes & Fashion/Jumpsuits"
      }
    ]
  }
]

Default electronics.json:

{
  "CategoryCode": "electronics",
  "CategoryName": "Electronics",
  "CategoryPath": "Electronics",
  "CategoryTypeCode": "promotion",
  "IsPromoted":   true,
  "CategoryMedia": [
    {
      "MediaType": "image",
      "MediaMimeType": "image/png",
      "MediaUsage": "promotion",
      "MediaTitle": "Electronics",
      "MediaReference": "electronics.png"
    }
  ],
  "CategoryAttributes": {
    "promo": {
      "Code":   "promo",
      "Label":  "Promotion"
    }
  },
  "Promotion": {
    "LinkType": "application/pdf",
    "LinkTarget": "blank",
    "Media": [
      {
        "MediaType": "pdf",
        "MediaMimeType": "application/pdf",
        "MediaUsage": "promotion",
        "MediaTitle": "Electronics",
        "MediaReference": "electronics.pdf"
      }
    ]
  }
}

You can provide a path for json files that include the data for the categories and the tree via commerce.category.fakeService.testDataFolder. The json file for the category tree has to be named categoryTree.json. Files that represent a category have to be named after the code of the category. The json file for the category with the code electronics for example has to be named electronics.json. If you do not offer a json file for a category the basic data for the category will be taken from the categoryTree.json instead.