delaneymethod / craft-category-groups
Two field types for Craft CMS that lets you select one or more Category Groups or one or more Categories from one or more Category Groups.
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:craft-plugin
pkg:composer/delaneymethod/craft-category-groups
Requires
- php: ^8.0
- craftcms/cms: ^4.0||^5.0
Requires (Dev)
- craftcms/ecs: dev-main
- craftcms/phpstan: dev-main
- friendsofphp/php-cs-fixer: ^3.87
- symplify/easy-coding-standard: ^10.3
README
Two field types for Craft CMS that:
- lets you select one or more Category Groups.
- lets you select one or more Categories from one or more Category Groups.
Install
- Add the repo to your project and install via Composer:
cd /path/to/project composer require delaneymethod/category-groups && php craft plugin/install category-groups
Usage
CategoryGroupField
- In the dropdown/radio buttons mode your field normalizes to a
CategoryGroup|null. - In checkbox mode you return an
array<CategoryGroup>.
Print the selected group name(s):
{% set fieldValue = entry.myCategoryGroupsFieldHandle ?? null %}
{% if fieldValue %}
{% if fieldValue is instance of('craft\\models\\CategoryGroup') %}
<p>Selected category group: {{ fieldValue.name }}</p>
{% elseif fieldValue is iterable %}
<p>Selected category groups:</p>
<ul>
{% for categoryGroup in fieldValue %}
<li>{{ categoryGroup.name }}</li>
{% endfor %}
</ul>
{% elseif fieldValue is string %}
{% set categoryGroup = craft.app.categories.getGroupByUid(fieldValue) %}
{% if categoryGroup %}
<p>Selected category group: {{ categoryGroup.name }}</p>
{% endif %}
{% else %}
<p>No category group selected.</p>
{% endif %}
{% else %}
<p>No category groups selected.</p>
{% endif %}
Use the selected category group to list its categories (current site)
{% if fieldValue is instance of('craft\\models\\CategoryGroup') %}
{% set categories = craft.categories().groupId(fieldValue.id).siteId(craft.app.sites.currentSite.id).status(null).orderBy('title asc').all() %}
{% if categories %}
<h4>Category group: {{ fieldValue.name }}</h4>
<ul>
{% for category in categories %}
<li><a href="{{ category.url }}">{{ category.title }}</a></li>
{% endfor %}
</ul>
{% else %}
<p><em>No categories found in {{ fieldValue.name }}.</em></p>
{% endif %}
{% elseif fieldValue is iterable %}
{% for categoryGroup in fieldValue %}
{% set categories = craft.categories().groupId(categoryGroup.id).siteId(craft.app.sites.currentSite.id).status(null).orderBy('title asc').all() %}
{% if categories %}
<h4>Category group: {{ categoryGroup.uid }}</h4>
<ul>
{% for category in categories %}
<li><a href="{{ category.url }}">{{ category.title }}</a></li>
{% endfor %}
</ul>
{% else %}
<p><em>No categories found in {{ categoryGroup.name }}.</em></p>
{% endif %}
{% endfor %}
{% elseif fieldValue is string %}
{% set categoryGroup = craft.app.categories.getGroupByUid(fieldValue) %}
{% if categoryGroup %}
{% set categories = craft.categories().groupId(categoryGroup.id).siteId(craft.app.sites.currentSite.id).status(null).orderBy('title asc').all() %}
{% if categories %}
<h4>Category group: {{ categoryGroup.name }}</h4>
<ul>
{% for category in categories %}
<li><a href="{{ category.url }}">{{ category.title }}</a></li>
{% endfor %}
</ul>
{% else %}
<p><em>No categories found for {{ categoryGroup.name }}.</em></p>
{% endif %}
{% else %}
<p><em>No category group found for {{ fieldValue }}.</em></p>
{% endif %}
{% endif %}
CategoryGroupsField
- Normalizes to a
CategoryQuery. - You can iterate, count, limit, etc.
List selected categories (title + group)
{% set categoryQuery = entry.myCategoryMultipleGroupsFieldHandle ?? null %}
{% if categoryQuery %}
{% set categories = categoryQuery.status(null).all() %}
{% if categories %}
<ul>
{% for category in categories %}
<li><a href="{{ category.url }}">{{ category.title }}</a> ({{ category.group.name }})</li>
{% endfor %}
</ul>
{% else %}
<p>No categories selected.</p>
{% endif %}
{% else %}
<p>No categories selected.</p>
{% endif %}
Count / limit / paginate
{% set categoryQuery = entry.myCategoryMultipleGroupsFieldHandle ?? null %}
{% if categoryQuery %}
{% set count = categoryQuery.count() }}
{% if count > 1 %}
<p>{{ count }} categories selected.</p>
{% else %}
<p>1 category selected.</p>
{% endif %}
{% set firstFiveCategories = categoryQuery.status(null).limit(5).all() %}
{% if firstFiveCategories %}
<p>First five categories:</p>
<ul>
{% for category in firstFiveCategories %}
<li><a href="{{ category.url }}">{{ category.title }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% endif %}