Table of contents
- Transform Craft CMS contents to custom data structures
- Create custom Transformer classes for your components
- Cache contents on a Transformer basis (via providing
getCacheKey)
- Craft CMS >= 5.x
1. Install
Install the package
cd /path/to/project
composer require fork/craft-transform2. Configure namespace and create transformers
- Copy the example
config.phpto your Craft config directory and rename it totransform.php - Specify the namespace to your custom Transformer classes (in your project plugin/module). Here's an example:
<?php
return [
'*' => [
'transformerNamespace' => '\company\project\transformers'
],
'dev' => [
'enableCache' => false,
],
'staging' => [
'enableCache' => true,
],
'production' => [
'enableCache' => true,
],
];In your project plugin/module create a transformers directory to put your transformers. Here is an example Transformer class:
<?php
namespace company\project\transformers;
use Craft;
use League\Fractal\TransformerAbstract;
class FooterTransformer extends TransformerAbstract {
public function transform()
{
$footer = Craft::$app->globals->getSetByHandle('footer');
$footerNavGlobals = $footer->footerNavigationElements->all();
$footerLinks = [];
foreach ($footerNavGlobals as $linkEntry) {
$link = [
'href' => $linkEntry->navigationLink->getUrl(),
'name' => $linkEntry->navigationLink->getText(),
'slug' => $linkEntry->navigationLink->hasElement() ? $linkEntry->navigationLink->getElement()->slug : $linkEntry->navigationLink->getUrl(),
'target' => $linkEntry->navigationLink->getTarget()
];
$footerLinks[] = $link;
}
return $footerLinks;
}
}In your templates you can use craft.transform.getData(). The first parameter is optional. It could be your entry to get the data from.
Also, it could be null. The second parameter must match with the corresponding Transformer class. E.g. pass 'Footer' to use the FooterTransformer.
{% set articleData = {
headline: entry.title,
contentBlocks: craft.transform.getData(entry, 'ContentBlocks')
} %}
{% include '@components/templates/article-page/article-page.twig' with {
header: craft.transform.getData(null, 'Header'),
headline: articleData.headline,
contentBlocks: articleData.contentBlocks,
footer: craft.transform.getData(null, 'Footer')
} only %}- Caching
- Logo
- Settings maybe (instead of config file)
Brought to you by Fork Unstable Media GmbH