Classifiers
===========

Classifiers provide a way to create custom categories or groups to organize and filter pages.


Usage
-----

Let's say you want to create a custom category: "Blog Category". Blog Category will be used
to filter article/blog pages on the site.

First, create a new Classifier under **Snippets > Classifiers** called "Blog Category"
and add several Terms underneath the Classifier, for example: "News", "Opinion", and "Press Releases".
These terms will function as categories. Create and reorder these Terms as needed.
Save the Classifier when finished.

Second, classify various Article pages by Blog Category terms:

* Edit an Article page.
* Open the **Classify** tab, and select the appropriate terms.
* Publish the page when finished.

To enable filtering Article pages by "Blog Category":

* Edit your Article Landing Page (may be named differently on your project - it should be the
  parent page of your Article Pages).
* Open the **Layout** tab, enable **Show child pages**, and then select "Blog Category"
  under **Filter child pages by** .
* Publish or preview the page, and you'll now see filtering options for every term under
  Blog Category.

Going a bit further, let's show a preview of the top 3 newest blog pages classified as "News"
automatically on the home page:

* Edit the home page.
* In the **Content** tab anywhere in the **Body** add a Responsive Grid Row, and then add a
  **Latest Pages** block.
* Set the **Parent page** to your Article landing page, and **Classified as** to
  "Blog Category > News".
* Publish or preview the page, and you'll now see the latest 3 articles classified as "News"
  on the home page.

Classifiers are not just limited to Article pages, they work an every page on the site.
Classifiers can be used to create product types, portfolios, categories, and any other
organizational structures your content may need.


Implementation
--------------

Classifiers are enabled by default on all ``CoderedPage`` models. The filtering HTML UI
is rendered in the ``{% block index_filters %}`` block on the page template, which originates
in ``base.html`` but is overridden in various other templates such as ``web_page_notitle.html``
and ``article_index_page.html``.

Wagtail CRX provides two filtering templates by default, a Bootstrap nav in
``coderedcms/includes/classifier_nav.html`` and a simple select/dropdown form in
``coderedcms/includes/classifier_dropdowns.html``. Most likely, you will want to implement your
own filtering UI based on your own website needs, but you can follow the example in these two
templates.

Classifiers are not limited to just Pages though - they can be used on Snippets or any other
model (Snippet example below)::

    from django.db import models
    from modelcluster.fields import ParentalManyToManyField
    from wagtail.admin.edit_handlers import FieldPanel
    from wagtail.snippets.models import register_snippet

    @register_snippet
    class MySnippet(models.Model):
        name = models.CharField(
            max_length=255,
        )
        classifier_terms = ParentalManyToManyField(
            'coderedcms.ClassifierTerm',
            blank=True,
        )
        panels = [
            FieldPanel('name')
            FieldPanel('classifier_terms'),
        ]


This will create a default list of checkboxes or a multi-select in the Wagtail UI
to select classifier terms. However, if you prefer to have the checkboxes grouped
by the Classifier they belong to (same UI as the **Classify** tab in the page editor),
use the built-in ``ClassifierSelectWidget``::

        from coderedcms.widgets import ClassifierSelectWidget

        panels = [
            FieldPanel('name')
            FieldPanel('classifier_terms', widget=ClassifierSelectWidget()),
        ]


Finally run ``python manage.py makemigrations website`` and ``python manage.py migrate`` to
create the new models in your project.
