Note: This plugin has been abandoned as Craft 4 includes Collections support.
Use Laravel Collections in Craft
This plugin requires Craft CMS 3.0.0-beta.23 or later.
To install the plugin, follow these instructions.
-
Open your terminal and go to your Craft project:
cd /path/to/project
-
Then tell Composer to load the plugin:
composer require superbig/craft3-collections
-
In the Control Panel, go to Settings → Plugins and click the “Install” button for Collections.
Here is some good inspiration on what you can do with Collections:
- Collections documentation
- Laravel Collections: PHP Arrays On Steroids
- Laravel Collections Examples on GitHub
- Laravel Collections “when” Method
- Code Bright: Eloquent Collections
- Refactoring To Collection
- 10 less-known (but awesome!) Laravel Collections methods
Add your macros to the config file:
<?php
return [
/** Add your macros here
* "macros" => [
* 'toUpper' => function () {
* return $this->map(function ($value) {
* return strtoupper($value);
* });
* },
* ],
*
*/
"macros" => [
],
];
Add this macro to your config:
<?php
return [
'macros' => [
'tagGroups' => function () {
return $this->groupBy(function ($tag) {
return substr($tag->title, 0, 1);
});
}
],
];
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.1.2/css/bulma.css">
</head>
<body>
<div class="section hero is-primary">
<div class="hero-body">
<div class="container">
<h1 class="title">Tags</h1>
<p class="subtitle">
Every tag on the site.
</p>
</div>
</div>
</div>
<h2>Tag groups</h2>
<div class="section">
<div class="container">
<ul class="has-columns has-text-centered">
{% set collection = craft.tags.group('media') | collect %}
{% for letter, tags in collection.tagGroups() %}
<div class="letter-group">
<h3 class="title is-1 letter">{{ letter }}</h3>
<ul>
{% for tag in tags %}
<li class="title is-5">
<a href="/tags/{{ tag.slug }}">{{ tag.title }}</a>
</li>
{% endfor %}
</ul>
</div>
{% endfor %}
</ul>
</div>
</div>
</body>
</html>
Brought to you by Superbig